;; declare lambda ($ a (-> (x) (* x 2))) (assert-eq? 14 (a 7)) ;; high order function ($ b (-> (x y) (x (x y)))) (assert-eq? 12 (b a 3)) ;; calling function literal (assert-eq? 7 ( (-> (x y) (+ x y 1)) 2 4 )) ;; syntaxic sugar for function declaration ($ (c n) (* 2 n)) (assert-eq? 18 (c 9)) ;; inner variable ($ (d x) ($ y 3) (+ x y)) (assert-eq? 7 (d 4)) ;; recursivity ($ (e n) (if (eq? 0 n) 1 (* n (e (- n 1))))) (assert-eq? 120 (e 5)) ;; self keyword (assert-eq? 720 ((-> (x) (if (eq? x 0) 1 (* x (self (- x 1))))) 6)) ;; inner functions ($ (f n) ($ (inner n) (+ n 1)) (inner (inner n))) (assert-eq? 3 (f 1)) ;; return function ($ (g) ($ (inner n) (* 7 n)) inner) (assert-eq? 42 ( (g) 6 )) ;; return lambda ($ (h) (-> (n) (* 3 (- n 2)))) (assert-eq? 15 ( (h) 7 )) ;; closure ($ (i init) ($ counter (- init 1)) (-> () (set! counter (+ counter 1)) counter)) ($ j (i 0)) ($ k (i 16)) (assert-eq? 0 (j)) (assert-eq? 16 (k)) (assert-eq? 17 (k)) (assert-eq? 1 (j)) (assert-eq? 2 (j)) (assert-eq? 18 (k)) (assert-eq? 19 (k)) (assert-eq? 3 (j)) (assert-eq? 4 (j)) (assert-eq? 5 (j)) (assert-eq? 20 (k))