next up previous
Next: 6.2 let マクロ Up: 6 マクロのコンパイル Previous: 6 マクロのコンパイル

6.1 and マクロ

たとえば,マクロ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日