Next: 6.2 let マクロ
Up: 6 マクロのコンパイル
Previous: 6 マクロのコンパイル
たとえば,マクロandは,
(def-scheme-macro and (&rest args)
(cond ((null args) 'T)
(t `(if ,(car args)
(and ,@(cdr args))))))
と定義してありました.これだと,
(and p q)は,(if p (if q t))と展開されることに
なり,
<cl> (comp-show '(and p q))
ARGS 0
GVAR P
FJUMP L830
GVAR Q
FJUMP L832
GVAR T
JUMP L833
L832: GVAR NIL
L833: JUMP L831
L830: GVAR NIL
L831: RETURN
NIL
となります.ここで,andのマクロ定義を,
(def-scheme-macro and (&rest args)
(cond ((null args) 'T)
((null (cdr args)) (car args))
(t `(if ,(car args)
(and ,@(cdr args))))))
とすれば,(and p q)は,(if p q nil)と
なり,
<cl> (comp-show '(and p q))
ARGS 0
GVAR P
FJUMP L878
GVAR Q
JUMP L879
L878: GVAR NIL
L879: RETURN
NIL
という簡潔なコードになります.
<cl> (comp-show '(if (and p q) x y))
ARGS 0
GVAR P
FJUMP L305
GVAR Q
JUMP L306
L305: GVAR NIL
L306: FJUMP L303
GVAR X
JUMP L304
L303: GVAR Y
L304: RETURN
NIL
generated through LaTeX2HTML. M.Inaba 平成18年5月6日