grino/examples/fun.gri

95 lines
1.4 KiB
Plaintext

;; 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))
($ m 1)
($ (n)
($ counter 0)
(-> ()
(set! counter (* 2 m))
(set! m (+ 1 m))
counter))
($ o (n))
($ p (n))
(assert-eq? 2 (o))
(assert-eq? 4 (o))
(assert-eq? 6 (o))
(assert-eq? 2 (p))
(assert-eq? 4 (p))
(assert-eq? 6 (p))
(assert-eq? 1 m)