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使う意味なし?