Lisp本積読解消: LISP 1.5 PRIMER — 19.6 MACROS — #:g1

Posted 2017-03-12 06:26:54 GMT

今回は、LISP 1.5 PRIMERのマクロの箇所を読む。
出版は、1967年で丁度半世紀前の本。
出版されたLISPの入門書としては最初期のものではないだろうか。もしかしたら最初の本なのかもしれない。

邦訳も1970年にLISP入門として出版されている。

自分が知る限りLISP入門以前にLISPの本は出版されていないようなので、日本語のLISP入門書はこれが初ではないだろうか。

表紙のタイトルがS式になっていて、こういう意匠もかなり初期の試みだったのではないだろうか。
なんとなく当時から括弧が好きだった人は好きだったんだなという感を抱いてしまう。

(LISP 1.5 PRIMER
  (BY
    (CLARK WEISSMAN)))

19 LIST STRUCTURES, PROPERTY LISTS, AND MACROS

面白いのが、リスト操作とマクロが一緒にされているところ。
実際リスト操作なのだが、バッククォートが発明されてからは、マクロを書くのはテンプレート操作という印象が強くなったように思う。
Schemeのsyntax-rulesに至ってはテンプレート言語だし。

さて、まず、特殊形式を実現するのにコンパイル時に展開するマクロが使えるということが解説される。
この辺りは、Timothy Hart氏がマクロをLISP 1.5に導入した経緯を踏まえているように思うが、この本では、特殊形式の役割は可変長引数と引数を評価しないこととしていて、マクロでそれらをどう処理できるのかを解説する。

なお、マクロの定義フォームは、MACROで、

MACRO (( (name (lambda (form) ....))
         (name (lambda (form) ....))  ))

のようになる。
ちなみに、defmacroでいうと&whole引数のようにフォーム全体が渡されてくる。

課題の一つである、可変長引数の処理については、コンパイル時にplusを固定引数の下請けである固定引数の*plusの組み合わせに展開してしまう手法を説明。

LISP 1.5では、マクロでの再帰的定義はできなかったようなので、展開用の*expandという関数を定義して、これがplus*plusに再帰的に展開する。
どうも展開用の関数を定義するというのは当時メジャーなマクロ書法だったようで1960年代後半のマニュアルなどにも頻繁に紹介されている。
展開用の関数がやっていることは、リスト操作の極みなので、マクロがリスト操作の章にあるのも分かる気はする。

また、もう一つの課題である、クォートの方は、csetという大域定数を定義する関数を、cset+quotecsetqにする例を取り上げる。

章末には、マクロの問題も、6つ程あるが面白いので解いてみることをお勧めする。
defmacroとバッククォートは使わない縛りだとなお面白い。

結び

日本の1970年代後半位の書籍だとマクロについては軽く触れられているのみだが、米国では1960年代からコンパイラと合せて紹介していることが多い。
日本ではコンパイラについてはあまり注目されなかったのだろうか。その辺が少し不思議。

ちなみに、1965年より前の文献になるとマクロは、「Timothy Hartのマクロ機構」という感じで、LISPにマクロを始めて導入したHart氏の名前と共に紹介されることが多いようだ。

なお、本書籍は、PDFがSoftware Preservation Groupからダウンロード可能なので一度眺めてみてもらいたい。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus