;; ;; Variable declarations and updates ;; (print "(def a 20)") (def a 20) (newline) (print "((lambda (a b) (+ 10 a b)) 1 2) -> ") ((lambda (a b) (+ 10 a b)) 1 2) (print "((lambda (a b) (+ 10 a b)) a 3) -> ") ((lambda (a b) (+ 10 a b)) a 3) (print "(def myfun (lambda (a b) (+ a b))) (myfun 6 9) -> ") (def myfun (lambda (a b) (+ a b))) (myfun 6 9) (print "(fun myfun (a b) (+ a b)) (myfun 6 9) -> ") (fun myfun (a b) (+ a b)) (myfun 6 9) (print "(+ 1 (myfun 10 (myfun a a)) 30) -> ") (+ 1 (myfun 10 (myfun a a)) 30) (print "(myfun 10 (myfun 5 0)) -> ") (myfun 10 (myfun 5 0)) ;; Closures. (print "(fun make-counter () (def value 0) (def counter (lambda () (set! value (+ value 1)) value)) counter)") (newline) (fun make-counter () (def value 0) (def counter (lambda () (set! value (+ value 1)) value)) counter) (print "(def counter-a (make-counter))") (def counter-a (make-counter)) (newline) (print "(def counter-b (make-counter))") (def counter-b (make-counter)) (newline) (print "(counter-a) -> ") (counter-a) (print "(counter-b) -> ") (counter-b) (print "(counter-a) -> ") (counter-a) (print "(counter-a) -> ") (counter-a) (print "(counter-a) -> ") (counter-a) (print "(counter-b) -> ") (counter-b) (print "(counter-b) -> ") (counter-b) (print "(counter-b) -> ") (counter-b) ;; Fibonacci. (print "(fun fib (n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2)))))") (newline) (fun fib (n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2))))) (print "(fib 15) -> ")(fib 15) ;; Lambda capture. (print "(fun b () (display a) (print \" --- \") (def a 42) (display a) (newline))") (newline) (fun b () (display a) (print " --- ") (def a 42) (display a) (newline)) (print "(b) -> ") (b) (print "(b) -> ") (b) ;; Infinite loop. (For teseting purposes) ; (def test (lambda (n) ; (print "ITER\n") ; (if (<= n 2) ; 'ok ; (test (+ n 1))))) ; (test 3)