Next: 10.6 クロージャの確認
Up: 10 リード,コンパイル,実行ループの実装
Previous: 10.4 関数のコンパイル
また,マクロ定義は次のようにできる.
<cl> (scheme-macro-expand
'(letrec
((mycar
(lambda (x) (car x))))
(mycar a)))
((LAMBDA (MYCAR)
(SET! MYCAR (LAMBDA (X) (CAR X)))
(MYCAR A)) NIL)
<cl> (scheme-macro-expand
'(let
((mycar
(lambda (x) (car x))))
(mycar a)))
((LAMBDA (MYCAR)
(MYCAR A))
(LAMBDA (X) (CAR X)))
<cl> (scheme-macro-expand
'(let*
((mycar (lambda (x) (car x))))
(mycar a)))
((LAMBDA (MYCAR)
(LET* () (MYCAR A)))
(LAMBDA (X) (CAR X)))
<cl> (scheme)
=> (define (test a)
(letrec
((mycar
(lambda (x) (car x))))
(mycar a)))
TEST
=> test
#S(FN :CODE
#((ARGS 1) (GVAR NIL)
(FN
#S(FN :CODE
#((ARGS 1)
(FN
#S(FN :CODE
#((ARGS 1)
(LVAR 0 0 ";" X)
(GVAR CAR) (CALL 1)
(RETURN))
:ENV
((MYCAR) (A) NIL)
:NAME NIL
:ARGS (X)))
(LSET 0 0 ";" MYCAR)
(POP)
(LVAR 1 0 ";" A)
(LVAR 0 0 ";" MYCAR)
(CALL 1) (RETURN))
:ENV ((A) NIL)
:NAME NIL
:ARGS (MYCAR)))
(CALL 1)
(RETURN))
:ENV (#())
:NAME TEST
:ARGS NIL)
=> (test '(a))
A
generated through LaTeX2HTML. M.Inaba 平成18年5月6日