Schemeのお勉強 その2

amazon購入本4冊の不在届け到着。平日は時間がよめない。土曜日までお預けだ。

lambda と クロージャ

lambda式はクロージャーになる(用語の使い方合ってるだろうか?)

gosh> (lambda (x y) (+ x y)) 
#<closure #f>
gosh> ((lambda (x y) (+ x y)) 10 20) 
30

define で名前束縛すれば、手続きとして使用できる。

gosh> (define f (lambda (x y) (+ x y)))
f
gosh> (f 1 2)
3

通常の関数(手続き)定義でも、作られるのはクロージャ

gosh> (define (g x y) (+ x y))
g
gosh> g
#<closure g>
gosh> f
#<closure f>

関数定義も、lambda式も同じものらしい。

可変長引数

第一引数の次に . を置くとその後ろの引数は可変長引数を受け取るリストになる。

gosh> (define (print-args a . args)
        (print a) (print args))
print-args
gosh> (print-args 1 2 3 4)
1
(2 3 4)
#<undef>
gosh> (print-args 1)
1
()
#<undef>

apply

リストを与えると、展開して手続きの引数にする。

gosh> (apply + '(1 2 3))     ;; (+ 1 2 3) と同じ
6
gosh> (apply + 1 2 '(3 4 5)) ;; (+ 1 2 3 4 5) と同じ
15

どういう時使うのか、よくわかんない。

beginと直列化

順次処理のこと。begin フォームのあとにS式を並べると順に評価される。

gosh> (begin (print 1) (print 2) (print 3) #t)
1
2
3
#t

例えば、lambda式で順次処理をしたい場合などに使える。でも無くても同じだったりする。

gosh>  ((lambda () (begin (print 1) (print 2) (print 3) #t)))
1
2
3
#t
gosh> ((lambda () (print 1) (print 2) (print 3) #t))
1
2
3
#t

関数定義の場合も特にbeginいらない。

gosh> (define (f) (print 1) (print 2) (print 3) #t)
f
gosh> (f)
1
2
3

トップレベル以外でbegin使う意味なし?