気になったので実験
ちょっと気になったことを実験してみた。
実験1:defineで名前をつけるとき、2つ目の引数は評価されるのか?
gosh> (define add-n (lambda (m) (+ m n))) add-n gosh> (add-n 1) *** ERROR: unbound variable: n Stack Trace: _______________________________________
少なくともdefineを評価したときは「nは束縛されてないよ!」って怒られなかった。
評価されてないから怒られなかったのかな?そういうわけではない?
いや、でもlambda式が評価されるから「add-n」っていう名前を手続きオブジェクトが束縛できるんだしな。
そうでないと、(lambda (m) (+ m n))っていうデータとしてのリストになっちまう。
結論:
- defineの第2引数は評価される。
- lambda式を評価して手続きオブジェクトを作る時は、その中に束縛されていない名前があってもOK
実験2:名前を付け替えた後で挙動がどう変化するか?
gosh> (define n 0) n gosh> (add-n 1) 1 gosh> (define n 1) n gosh> (add-n 1) 2
ほうほう、なるほど。
gosh> (define first (lambda (l) (car l))) first gosh> (first '(foo bar baz)) foo gosh> (define car cdr) car gosh> (car '(foo bar baz)) (bar baz) gosh> (first '(foo bar baz)) foo
んー???よくわからん。
なんで最後が
(bar baz)
にならんのやろ?
結論:
- よくわからん。