; Iter 16b.5 — LetRec name as value, with capture. A recursive ; helper `factorial_plus` captures the outer fn-param `base` and is ; passed as a VALUE to a higher-order combinator. The lifted fn has ; signature `factorial_plus$lr_N(n: Int, base: Int) -> Int`. The ; eta-Lam wrap binds `factorial_plus` in the in-clause to a ; `(lam (n) (app factorial_plus$lr_N n base))` — the Lam's free var ; `base` becomes a closure-env capture under the standard 8b ABI. ; This exercises the dynamic-env path (lifted fn has extra params, ; the eta-Lam captures them). ; ; Expected stdout (one per line): ; apply5(factorial_plus[base=10]) = 5*4*3*2*(1+10) = 1320 ; apply5(factorial_plus[base=100]) = 5*4*3*2*(1+100) = 12120 (module local_rec_as_value_capture (fn apply5 (doc "Higher-order: applies its fn argument to 5.") (type (fn-type (params (own (fn-type (params (own (con Int))) (ret (own (con Int)))))) (ret (own (con Int))))) (params f) (body (app f 5))) (fn run_with_base (doc "Build a recursive helper that captures `base` and pass it as a value to apply5.") (type (fn-type (params (own (con Int))) (ret (own (con Int))))) (params base) (body (let-rec factorial_plus (params n) (type (fn-type (params (own (con Int))) (ret (own (con Int))))) (body (if (app le n 1) (app + 1 base) (app * n (app factorial_plus (app - n 1))))) (in (app apply5 factorial_plus))))) (fn main (doc "Iter 16b.5: pass a capturing let-rec helper as a value. Expected stdout: 1320, 12120.") (type (fn-type (params) (ret (own (con Unit))) (effects IO))) (params) (body (seq (seq (app print (app run_with_base 10)) (do io/print_str "\n")) (seq (app print (app run_with_base 100)) (do io/print_str "\n"))))))