マクロの動作(2)

(defmacro m7 (n)
  (+ n 1))
(m7 -15)
|
-14
(macroexpand'(m7 -15))
|
-14
;展開時に縮約されている。


(defmacro ms1 (macro)
  `(macroexpand'(,macro -15)))
(macroexpand'(ms1 m7))
|
(macroexpand '(m7 -15))
;たるいので適当なマクロを導入


(defmacro m8 (n)
  (if (plusp n) `(m7 ,n)
    `(m7 ,(- n))))
(m8 -15)
|
16

(ms1 m8)
|
16
;quote 1つは消費される。

(defmacro m9 (n)
  `(sqrt (m8 ,n)))
(m9 15)
|
4.0

(ms1 m9)
|
(sqrt (m8 -15))
;マクロ内の式に含まれるマクロを先に展開できない。


(defmacro m10 (n)
  `(m9 ,n))
(ms1 m10)
|
(sqrt (m8 -15))
;呼び出し直しても無駄。


(defmacro m11 (n)
  (macrolet ((k () `(m10 ,n)))
    (k)))
(m11 -15)
|
4.0

(ms1 m11)
|
4.0
;マクロ内でもう一度呼び出せばよい。


(defmacro mx (body)
  (macrolet ((k () body))
     (k)))

(macroexpand'(mx (m9 15)))
|
4.0
;この呼び出し方をマクロ化出来る。