構文の拡張

やっとここまで来たなぁ。18章は「構文の拡張」。
...って、12〜17章はすっ飛ばした。悪しからず。いつか読む。
とにかく18章と19章が早く読みたかったし、特に飛ばしても差し支えなさそうだったし。


さて、18章はLISPLISPたらしめると言われている(どこで?)マクロのお話し。これは絶対理解しておきたいところ。
1つ前のエントリ(id:yagiey:20100126:1264523800)の通り、細かいことは分からないけど、

マクロとは式の変換です。

Scheme 入門 15. 構文の定義

とのこと。式の変換ね、なるほど。


さて、Schemeには以下の必須構文があるそうだ。プリミティブな構文とでも言えるかな。

  • define
  • set!
  • lambda
  • if
  • quote
  • define-syntax
  • let-syntax
  • letrec-syntax
  • begin

これら必須構文以外の構文(letやcondなど)は、必須構文や手続きを組み合わせて定義されるのだと。つまり式の変換(3回目)で定義できると。
この変換の規則のマクロと呼び、式が変換されることをマクロの展開と呼ぶそうだ。


データとしてのLISPコードをごにょごにょやって、ごにょごにょやった後の式が評価されるわけね。メタプログラミングくさい。
で、この式の変換規則はプログラマが自由に定義できるのだと。それが構文の拡張、すなわちマクロの定義。


R5RSに準拠するScheme処理系でマクロの定義するには、大きく分けて以下の2つの方法がある。

R5RSマクロ
パターンマッチによるマクロ
レガシーなマクロ
LISP系言語に受け継がれてきた、S式を直接操作する伝統的なマクロ


...つづく。