気になったので実験

ちょっと気になったことを実験してみた。

実験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)

にならんのやろ?


結論:

  • よくわからん。