forked from alex-eg/sex
Lambdas rotted because there wasn't any test for them, and after return type moved to the end, lambdas stayed assumning it in the front. We fix this and add test program
45 lines
1.3 KiB
Scheme
45 lines
1.3 KiB
Scheme
(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))
|