(input) (output "Named fn through a pointer: 30" "Lambda through a pointer: 30" "Lambda called in place: 130" "Nested lambdas: 666") (return 0) ;;; Lambdas are lifted into toplevel functions by semen, so what this ;;; really checks is that the lifted `fn' comes out in the argument ;;; order the writer expects -- (fn name arglist ret-type . body). (include stdio.h) (fn sum ((a int) (b int)) int (return (+ a b))) (pub fn main () int (var a int 10) (var b int 20) (var sum-fn (fn ((int) (int)) int) sum) (printf "Named fn through a pointer: %d\n" (sum-fn a b)) (var sum-lambda (fn ((int) (int)) int) (lambda ((a int) (b int)) int () (return (+ a b)))) (printf "Lambda through a pointer: %d\n" (sum-lambda a b)) (printf "Lambda called in place: %d\n" ((lambda ((a int) (b int)) int () (return (+ a b 100))) a b)) ;; A lambda inside a lambda: the inner one is lifted out of a ;; function that is itself being lifted (var outer (fn ((int)) int) (lambda ((x int)) int () (var inner (fn ((int)) int) (lambda ((y int)) int () (return (+ 60 y)))) (return (+ 600 (inner x))))) (printf "Nested lambdas: %d\n" (outer 6)) (return 0))