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
52 lines
1.5 KiB
Scheme
52 lines
1.5 KiB
Scheme
(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)
|
|
|
|
(var sum-lambda (fn ((int) (int)) int)
|
|
|
|
(lambda ((a int) (b int)) int ()
|
|
(return (+ a b))))
|
|
|
|
(var sum-lambda-2 (fn ((int)) int)
|
|
|
|
(lambda ((a int)) int ()
|
|
(return (+ a 20))))
|
|
|
|
(printf "Hello from main fn!\n")
|
|
(printf "We will now perform some function calling.\n")
|
|
|
|
(printf "Calling fn ptr: %d\n" (sum-fn a b))
|
|
(printf "Calling lambda: %d\n" (sum-lambda a b))
|
|
(printf "Calling other lambda: %d\n" (sum-lambda-2 a))
|
|
(printf "Calling lambda inplace: %d\n" ((lambda ((a int) (b int)) int ()
|
|
(return (+ a b 100)))
|
|
a b))
|
|
|
|
(var l-1 (fn ((int)) int)
|
|
(lambda ((a int)) int ()
|
|
(var l-2 (fn ((int)) int)
|
|
(lambda ((a int)) int ()
|
|
(return (+ 60 a))))
|
|
(return (+ 600 (l-2 a)))))
|
|
(printf "Calling nested lambdas: %d\n" (l-1 6))
|
|
|
|
;; Not supported yet
|
|
;; Closure
|
|
;; (var (fn (fn ((int)) int) ((int))) make-adder
|
|
;; (lambda (fn int ((int a))) ()
|
|
;; (return (lambda int ((int b)) (a)
|
|
;; (return (+ a b))))))
|
|
;;
|
|
;; (var (fn int ((int))) add-10
|
|
;; (make-adder 10))
|
|
;; (var (fn int ((int))) add-20
|
|
;; (make-adder 20))
|
|
;; (printf "Calling closures: %d\n" (add-10 24))
|
|
(return 0))
|