; Iter 16e — `==` extends from Int-only to Int/Bool/Str/Unit (polymorphic ; dispatch). The builtin's declared type became ; forall a. (a, a) -> Bool ; and codegen monomorphises on the resolved arg type: ; Int → icmp eq i64 ; Bool → icmp eq i1 ; Str → @strcmp + icmp eq i32 0 ; Unit → constant i1 true (single-inhabitant type) ; ADT/Fn → rejected at codegen with a clear error. ; ; This fixture exercises all four supported types, both directly via ; `(app == ...)` and indirectly via 16c's lit-pattern desugar (which ; rewrites `(pat-lit "hi")` → `(if (== sv "hi") body fall_k)` and ; therefore inherits 16e's polymorphic `==`). ; ; Expected stdout (one per line): ; true ; (== 5 5) ; false ; (== 5 6) ; false ; (== true false) ; true ; (== true true) ; true ; (== "hi" "hi") ; false ; (== "hi" "ho") ; true ; (== () ()) ; 1 ; classify_str "hi" (lit-pattern hits 1 arm) ; 2 ; classify_str "ho" (lit-pattern hits 2 arm) ; 0 ; classify_str "??" (default arm) ; ; Driver lowers via io/print_bool / io/print_int. (module eq_demo (fn classify_str (doc "Lit-pattern over Str; exercises 16c's build_eq for non-Int.") (type (fn-type (params (con Str)) (ret (con Int)))) (params s) (body (match s (case (pat-lit "hi") 1) (case (pat-lit "ho") 2) (case _ 0)))) (fn main (doc "Drive == at Int/Bool/Str/Unit; then drive classify_str.") (type (fn-type (params) (ret (con Unit)) (effects IO))) (params) (body (seq (do io/print_bool (app == 5 5)) (seq (do io/print_bool (app == 5 6)) (seq (do io/print_bool (app == true false)) (seq (do io/print_bool (app == true true)) (seq (do io/print_bool (app == "hi" "hi")) (seq (do io/print_bool (app == "hi" "ho")) (seq (do io/print_bool (app == (lit-unit) (lit-unit))) (seq (do io/print_int (app classify_str "hi")) (seq (do io/print_int (app classify_str "ho")) (do io/print_int (app classify_str "??"))))))))))))))