The script is in tools/ rather than thrown away, because two lanes are
writing Flan in the old spelling right now and their files need the same
pass at merge.
It works on forms, not on text: a keyword becomes a dot only where it sits
in a field-label position inside a brace, so an enum member in value
position, a map key inside an EDN string and a type-position {K V} are all
left alone. :keys keeps its colon -- it names no field.
48 lines
1.5 KiB
Plaintext
48 lines
1.5 KiB
Plaintext
;;;; Globals, 2-D fixed arrays, places, pointers, casts and match — the
|
|
;;;; milestone-2 surface calc-me does not reach.
|
|
(defconst rows 3)
|
|
(defconst cols 4)
|
|
(defvar grid [rows [cols i32]])
|
|
(defvar total i32)
|
|
(defconst pal [4 u32] [10 20 30 40])
|
|
|
|
(defstruct P [x i32 y i32])
|
|
(defstruct Line [a P b P])
|
|
|
|
(defn bump [p (Ptr P)]
|
|
(set (.x p) (+ (.x p) 1)))
|
|
|
|
(defn sum-grid [] i32
|
|
(let [t 0 r 0]
|
|
(while (< r rows)
|
|
(let [c 0]
|
|
(while (< c cols)
|
|
(set t (+ t (at grid r c)))
|
|
(set c (+ c 1))))
|
|
(set r (+ r 1)))
|
|
t))
|
|
|
|
(defn find [n i32] (Option i32)
|
|
(if (> n 0) (Some (* n 2)) None))
|
|
|
|
(defn main [] i32
|
|
(set (at grid 1 2) 7)
|
|
(set (at grid 0 0) 5)
|
|
(set total (sum-grid))
|
|
(print total) (println "") ; 12
|
|
(print (at pal 2)) (println "") ; 30
|
|
(let [p (P {.x 1 .y 2})] ; :y omitted is zeroed
|
|
(bump (addr p))
|
|
(print (.x p)) (println "") ; 2
|
|
(let [l (Line {.a p})]
|
|
(print (.y (.a l))) (println ""))) ; 2
|
|
(print (/ 7 2)) (println "") ; 3 integer divide
|
|
(print (/ (f64 7) 2.0)) (println "") ; 3.5 float divide
|
|
(print (match (find 21) (Some v) v None 0)) (println "") ; 42
|
|
(print (match (find -1) (Some v) v None 99)) (println "") ; 99
|
|
(let [q (addr total)]
|
|
(print (deref q)) (println "") ; 12
|
|
(set (deref q) 123)
|
|
(print total) (println "")) ; 123
|
|
0)
|