2023-09-11 18:59:54 +00:00
|
|
|
;; 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
|
2023-09-11 20:18:11 +00:00
|
|
|
(assert-eq? 7 ( (-> (x y) (+ x y 1)) 2 4 ))
|
|
|
|
|
|
|
|
;; syntaxic sugar for function declaration
|
|
|
|
($ (c n) (* 2 n))
|
2023-09-12 04:36:55 +00:00
|
|
|
(assert-eq? 18 (c 9))
|
|
|
|
|
|
|
|
;; inner variable
|
|
|
|
($ (d x) ($ y 3) (+ x y))
|
2023-09-12 09:05:34 +00:00
|
|
|
(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))
|
2023-09-12 09:16:05 +00:00
|
|
|
|
|
|
|
;; 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))))
|
|
|
|
|
2023-09-12 10:20:29 +00:00
|
|
|
(assert-eq? 15 ( (h) 7 ))
|
2023-09-12 12:32:14 +00:00
|
|
|
|
|
|
|
;; 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))
|