Go to the first, previous, next, last section, table of contents.

マクロに対する関数

Special Form: defmacro symbol arglist [docstring] body*

(defun と同じように) マクロを定義します。 (作られた)マクロを指すよう、 symbol の関数セルを変更します。マクロは arglist と、 body 中のフォームを 持って作られます。

symbol を(値として)返します。

arglist がシンボルのリストでない場合、エラーになります。 (実際には、 arglist のフォームをチェックするのはマクロを実行する時だけであり、正しくな いものを入れることはできます)。マクロをインタラクティブに呼ぶことはできま せん。

マクロのアーギュメントを(例えば eval を用いて) 明示的に評価しなくてはいけ ない場合、その actual アーギュメントにマクロの formal アーギュメントや let(による構成)で宣言された変数を (そのローカル変数の前の値ではなく、その 値を用いることを意図していない場合) 用いないよう、注意深くアレンジしなくて はいけません。

マクロを用いるファイルをバイトコンパイル(チャプター 14 [バイトコンパイ ル]、ページ 117 参照) する場合、マクロを用いたフォームを評価する前に、その マクロを定義するようにしなくてはいけません。また、マクロ中に用いられたシン ボルはバイトコンパイル時に値に展開されるため、ダイナミックバインディングを 用いることはできません。 (これは正しい??)

Function: macroexpand form

この関数は、 form の car を見て、それがマクロの場合、それを展開したフォー ムを返します。 macroexpand はフォームをリカーシブに展開するため、得られた フォームの car がマクロである場合、それも展開します。しかし、マクロフォー ムである arguments (subexpression) は展開しません(訳注:??)。

マクロ展開の手順は、マクロ呼び出しでマクロを展開する際に用いられるものに似 ています (このため、マクロ呼び出しでどのように展開されるかを調べるのに macroexpand を用いることができます)。違うのはリカーシブなマクロ展開の回数 に制限がない点と、 (シンボルの関数セルだけでなく) 間接(訳注:indirection) シンボルのローカルバインディングを用いる点です (これは意図的に??)。セク ション 3.2.3.2 [マクロ呼び出し]、ページ 27 参照。

  (defmacro inc (var)
      (list 'setq var (list '1+ var)))
  => inc
  (macroexpand '(inc r))
  => (setq r (1+ r))
  (defmacro inc2 (var1 var2)
      (list 'progn (list 'inc var1) (list 'inc var2)))
  => inc2
  (macroexpand '(inc2 r s))
  => (progn (inc r) (inc s))       ; ここでは、inc は 展開されない。


Go to the first, previous, next, last section, table of contents.