next up previous
Next: 11 リードマクロの利用 Up: 10 リード,コンパイル,実行ループの実装 Previous: 10.5 マクロ定義

10.6 クロージャの確認

変数環境を閉じ込めるクロージャが 実現できているかどうかを見てみると

=> (define a ((lambda (x)
                (lambda (y) (set! x (+ x y))))
              10))
A
=> a

#S(FN
   :CODE
   #((ARGS 1) (LVAR 1 0 ";" X)
     (LVAR 0 0 ";" Y) (GVAR +) (CALL 2)
     (LSET 1 0 ";" X) (RETURN))
   :ENV (#(10) #()) :NAME A :ARGS NIL)
=> (a 3)
13
=> (a 5)
18
=> (a 10)
28
=> a

#S(FN
   :CODE
   #((ARGS 1) (LVAR 1 0 ";" X)
     (LVAR 0 0 ";" Y) (GVAR +) (CALL 2)
     (LSET 1 0 ";" X) (RETURN))
   :ENV (#(28) #()) :NAME A :ARGS NIL)
=> (a 20)
48
=> a

#S(FN
   :CODE
   #((ARGS 1) (LVAR 1 0 ";" X)
     (LVAR 0 0 ";" Y) (GVAR +) (CALL 2)
     (LSET 1 0 ";" X) (RETURN))
   :ENV (#(48) #()) :NAME A :ARGS NIL)
という具合に,envに蓄えられています.

generated through LaTeX2HTML. M.Inaba 平成18年5月6日