マクロの解説::CommonLisp

マクロの解説::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