;;;; 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-i64 (i64 total)) (newline) ; 12 (print-i64 (i64 (at pal 2))) (newline) ; 30 (let [p (P {:x 1 :y 2})] ; :y omitted is zeroed (bump (addr p)) (print-i64 (i64 (.x p))) (newline) ; 2 (let [l (Line {:a p})] (print-i64 (i64 (.y (.a l)))) (newline))) ; 2 (print-f64 (f64 (/ 7 2))) (newline) ; 3 integer divide (print-f64 (/ (f64 7) 2.0)) (newline) ; 3.5 float divide (print-i64 (i64 (match (find 21) (Some v) v None 0))) (newline) ; 42 (print-i64 (i64 (match (find -1) (Some v) v None 99))) (newline) ; 99 (let [q (addr total)] (print-i64 (i64 (deref q))) (newline) ; 12 (set (deref q) 123) (print-i64 (i64 total)) (newline)) ; 123 0)