漠然とした不安
なにがそんなにモヤモヤするのかちょっと考えてみた。そしたら、以下のことが、漠然とした不安を感じさせているんじゃないかと気づいた。
gosh> (lambda (a b) (foo a b)) #<closure #f> gosh> ((lambda (a b) (foo a b)) 1 2) *** ERROR: unbound variable: foo Stack Trace: _______________________________________
ラムダ抽象ではエラーにならないで、適用して初めて怒られるんだよね。
前回のエントリに当てはめて言うと、次の式を評価して得られる手続き
((lambda (y) (lambda (x) (begin (set! y (+ x y)) y))) 10)
を引数1に適用するときに、最初に示したような理由でエラーにならないかという漠然とした心配。あくまで感覚的なもの。まぁ、
- 適用する時点で、エラーにならないように正しく環境ができてる(プログラマの責任?)
- evalが環境フレームモデルに則って実装される(処理系実装者の責任?)
が満たされていれば、ちゃんと動くんだろうから、無用な心配だろうけどね。
値としての手続きが処理系によってどのように内部的に保持されているかが見えない点も、不安にさせる要因だと思う。これは今から心配しても仕方ないな。実装したくなったときにでも、オープンソースのScheme処理系のソースを読むとかして勉強すればいいしな。