45 lines
1.2 KiB
Scheme
45 lines
1.2 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))
|