lambda式でほげほげするぞ。

lambdaは無名関数を作ってくれる感じ。

gosh> (lambda () 10) ; lambdaは「引数を取らず、10を返す無名関数」を返す
#<closure 009DDE00()>
gosh> ((lambda () 10)) ; lambdaが生成した無名関数を評価
10
gosh> ((lambda (x) (+ x 1)) 30) ; 引数に+1する関数に30を与えて評価
31
gosh> (define inc (lambda (x) (+ x 1))) ; defineで、lambdaが生成した無名関数をincと定義
inc
gosh> (inc 22)
23
gosh> (define (inc x) (+ x 2))
inc
gosh> (inc 22)
24

(define function (lambda (arg1 arg2 ...) (...)))(define (function arg1 arg2 ...) (...))と省略して書くことができる。俺はなんか好かんから使わない方向性。

ちょっと定番の階乗でも書いてみよう

gosh> (define pow (lambda (x) (if (= x 1) 1 (* x (pow (- x 1))))))
pow
gosh> (pow 3)
6
gosh> (pow 5)
120
gosh> (pow 3.1) ;無限ループ!!

ちょっとリストとかと組み合わせてほげらせてみよう。

gosh> (define sum (lambda (lst) (if (null? lst) 0 (+ (car lst) (sum (cdr lst))))))
sum
gosh> (sum '(0 1 2 3 4))
10
gosh> (sum '(0 1 2 3 4 100 1))
111
gosh> (map - '(3 4) '(1 2)) ; mapは与えられた演算を引数のリストの全要素に対しておこなう
(2 2)
gosh> (map - '(3 8) '(1 2))
(2 6)

test