kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

クロージャ作ろう(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

動くなあ
・・・そうか、動くなあ

これが動いたらクロージャできました!って言う予定だったのに
これじゃテストになってないのか
ちょっと顔洗って出直してくる(寝る