Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-12-26

Practical Common Lisp (15)

| 05:14 | Practical Common Lisp (15) - わだばLisperになる を含むブックマーク はてなブックマーク - Practical Common Lisp (15) - わだばLisperになる

引き続きPractical Common Lisp 第4章4. Syntax and Semanticsを読んでメモしてみています。

Macros

  • スペシャルオペレータは関数呼び出しの方法を拡張したものではあるが、それは言語の標準で定められたものでもある。
  • 一方、マクロはユーザに文法を拡張する手段を提供する。
  • 3章で見たように、マクロはS式を引数としてとって任意のLispフォームへ展開し、展開された場所で評価される仕組となっている。
  • マクロの評価は2段階に分かれる
    1. まず、マクロのフォームは、中身を評価されることなくマクロ展開機構に渡される
    2. マクロ展開機構から展開された結果のフォームが返されるので、それを通常の評価方法で評価する。
  • この2段階で処理されるということを心にとめておくことは重要。REPLで対話的に操作していると、あっという間に処理が終ってしまうので、このことを見失いがち。
  • しかし、Lispのコードがコンパイルされる時には、完全に別々の2段階を踏んで実行されるので、きちんと把握することが重要。
  • 例えば、COMPILE-FILE関数で、一つのソースコードファイルを丸ごとコンパイルする場合、そのファイルの中のマクロは再帰的にすべて展開され、関数とスペシャルフォームだけが含まれたものまで展開される。
  • マクロ抜きされたものが、LOAD関数でロードできるFASL形式のファイルへとコンパイルされる。これは、コンパイルされはするもののその際に実行はされない。
  • マクロ展開がコンパイル時に行われるということは、コンパイルされたファイルをロードする際には、マクロを展開するという労力を払わなくても良いということを意味する。
  • また、評価器がマクロ展開機構に展開される前のフォームを評価することはないので、マクロのフォームは正規のLispのフォームの形をしている必要もない。
  • 各々のマクロは、させたいことを展開してS式に割り当てる手段を提供する、換言すれば、各々のマクロはローカルな文法を持つことが可能ということでもある。
  • 例えば、3章で例に上げた、さかさフォームのマクロは、正規のLispフォームがさかさまになったものを与えられれば、正規のLispフォームを返すという文法を定めていることになる。
  • マクロが果す役割としては、コンパイラへのフックの提供という目的もある。文法的には関数呼び出しと非常に類似しているのだが、提供するものはまったく違う。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20071226