マクロの解説::CommonLisp
簡単な例をやる。
reverse関数は引数に1つのリストをとり,そのリストの順序を反転したリストを返す関数。
backwardsというマクロを定義する。
マクロの定義は,defmacroに続けて名前,パラメータリスト,本体の式からなる。
#+BEGIN_SRC
CL-USER> (defmacro backwards (expr) (reverse expr))
BACKWARDS
CL-USER> (backwards ("hello, world" t format))
hello, world
NIL
#+END_SRC
動作を説明する。
- REPLがbackwardsがマクロの名前であることを認識する。
- 式("hello, world" t format)は評価されずに放っておかれる。
- backwordsの中でリストはreverseに渡され (format t "hello, world") というリストがREPLに返される。
- REPLが (format t "hello, world") を評価する。
マクロの動作おいて動作効率はまったく同じになる。
マクロフォームの評価のフェーズ
2つのフェーズがある。
例えば,ソースコードをcompile-fileでコンパイルするとき,全てのファイルの中の全てのマクロフォームは,
関数と特殊フォームだけで構成されるコードになるまで再帰的に展開され,
マクロの無いコードになってからloadで読み込めるfaslファイルへとコンパイルされる。
ただし,コンパイルされたコードはロードされるまで実行されない。
マクロが展開されるのはコンパイル時なので,ファイルのロード時や
ファイル中に定義された関数の呼び出し時に,マクロ展開のコストを支払う必要なく
展開時に比較的大量に作業ができるようになる。
最終更新:2011年12月16日 16:21