クロージャ作ろう(1)
lambda作ったのでもうひとがんばりしてクロージャも作りたい
今は渡された引数のことしか知らないので静的スコープどころか動的スコープもありません
こういうのはまだ動かないと・・・
> (meval '((lambda (a) ((lambda (b) (+ a b)) 2)) 1))
3
動いたな
なんでだ
天才だから?(違う
そうか
(lambda (b) (+ a b))
のa
が先に置き換えられて1になってるのか
((lambda (b) (+ 1 b)) 2)
になるってことだな
((lambda (b) (+ a b)) 2)
を評価しようとしてa
なんて知らないよ、って
言われるイメージだった
わかってなかったな
これは動的スコープになってる、ってことだろうか
たまたまこのケースでは動いただけ、かな?
もう少し試す
> (meval '(define adder (lambda (n) (lambda (m) (+ n m)))))
> (meval '(define add2 (adder 2)))
> (meval '(add2 3))
caddr: contract violation
expected: (cons/c (cons/c any/c pair?) any/c)
given: '(adder 2)
これはどうも、違った意味でエラーになっている気がする
わかった
define
の第2引数は評価しておかないといけないんだ
:
((list 'define name body)
(set! env (cons (list name (meval body)) env)))
:
だからと言って動くとは限ら
> (meval '(define adder (lambda (n) (lambda (m) (+ n m)))))
> (meval '(define add2 (adder 2)))
> (meval '(add2 3))
5
動くなあ
・・・そうか、動くなあ
これが動いたらクロージャできました!って言う予定だったのに
これじゃテストになってないのか
ちょっと顔洗って出直してくる(寝る