Lisp本積読解消: Anatomy of LISP — 3.12 Special Forms and Macros — #:g1

Posted 2017-03-04 17:35:50 GMT

今回は、Anatomy of LISP / John Allenのマクロの箇所を読む。

LISPの構造として邦訳もある。
邦訳は入手できていないので詳細は不明だが、どうも邦訳の方は端折っている部分が多いらしい。

原著の初版は1978年で、LISP処理系の内部を解説した名著として知られている。
マクロについては、3章のEVALUATION OF LISP EXPRESSIONSの評価器から眺めた解説と、6 6章のTHE DYNAMIC STRUCTURE OF LISPのコンパイラから眺めた解説がある。

3.12 Special Forms and Macros

eval(インタプリタ)から眺めた特殊形式とマクロの解説。
andを実現するのに、まず、関数ではandが作れないことを解説し、evalを拡張する方法を示す(evandを作成)。
次に、同様のことを実現するのにマクロというものを評価器に導入することを説明。

また、可変長引数を実現するのにマクロを使うという手法を解説する。
可変長引数のplusは固定引数(2つ)の*plusに展開されるというもので、マクロそのものを用いてはいないが、現在もCommon Lisp内部ではコンパイラがインライン展開etc.で行なっていることと同じ。

マクロの種類として

  1. Textual Substitusion
  2. Syntax Macro
  3. Computational Macro

三つを取り上げ、単なる文字列の置き換え→構文の置換→サブツリーの変換と強力になることを説明するが、Computational Macroであっても扱うサブツリーに必要な情報が含まれている場合にしか有効でなく、サブツリー以外の場所の情報を必要とする場合や、サブツリーに追加情報が必要な場合にも、うまく立ち回ることができていないことを解説する。

6.18 Macros and Special Forms

コンパイラの方からマクロを眺めた解説。
大体インタプリタの方と同じだが、コンパイラからすると扱いが厄介な特殊形式を排除できることと、マクロはコンパイル時に計算してしまえる部分を多くすることが可能で効率的な処理に寄与することが解説されている。
また、特殊形式が増えるとevalが複雑で重くなるという解説もある。

結び

古代のLISPでは、マクロを説明する際には、FEXPRであったり特殊形式との比較が出てくることが多い。

マクロには、処理系を改造しなければいけない所をユーザーレベルで拡張できるところ増やす、という効用があった。
また、コンパイル時計算との親和性も高く、FEXPRで実現できることも大抵置き換えることが可能なので、FEXPRのようなコンパイルが難しい(と当時は考えられていた)形式も置き換えることとなった。

処理系内部をユーザーに開放しつつ効率が良い道具を提供するというのもLISP処理系の一つの核となる歴史の流れかなあと思う(マクロ、MOP、etc.)


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus