構文の拡張
やっとここまで来たなぁ。18章は「構文の拡張」。
...って、12〜17章はすっ飛ばした。悪しからず。いつか読む。
とにかく18章と19章が早く読みたかったし、特に飛ばしても差し支えなさそうだったし。
さて、18章はLISPをLISPたらしめると言われている(どこで?)マクロのお話し。これは絶対理解しておきたいところ。
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式を直接操作する伝統的なマクロ
...つづく。