next up previous
Next: 10.6 クロージャの確認 Up: 10 リード,コンパイル,実行ループの実装 Previous: 10.4 関数のコンパイル

10.5 マクロ定義

また,マクロ定義は次のようにできる.
<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日