;;;; A dyn beside a typed value is compared, added and joined as a dyn, in ;;;; either order, whichever conversion asking for the typed value would have ;;;; opened it with — a bool compared with a dyn int is false, not a trap. (defn as-dyn [d dyn] dyn d) (defn eqb [b bool d dyn] bool (= b d)) (defn eqi [b i64 d dyn] bool (= b d)) (defn addf [b f64 d dyn] dyn (+ b d)) (defn addi [b i64 d dyn] dyn (+ b d)) (defn mb [o (Option i32) b bool d dyn] dyn (let [v (match o (Some q) b None d)] v)) (defn mb2 [o (Option i32) b bool d dyn] dyn (let [v (match o None d (Some q) b)] v)) (defn ib [c bool b bool d dyn] dyn (let [v (if c b d)] v)) (defn ib2 [c bool b bool d dyn] dyn (let [v (if c d b)] v)) (defn main [] i32 (println (eqb true (as-dyn 1))) (println (eqb true (as-dyn true))) (println (eqi 1 (as-dyn 1.0))) (println (addi 1 (as-dyn 1.5))) (println (addf 1.0 (as-dyn 2))) (println (mb None true (as-dyn 5))) (println (mb2 None true (as-dyn 5))) (println (ib false true (as-dyn 5))) (println (ib2 true true (as-dyn 5))) 0)