Emacs lisp define-syntax
質問
それはSchemeとの類推ですか define-syntax
ELispで?で define-syntax
私はいくつかのキーワードを指定することができ、elispで defmacro
私はできないようです。編集:私はあなたをよく理解していないか、私の質問は明確ではないようです。Schemeでは、次のような予約語でマクロを定義することができます
(ループ
for
ain
いくつかのリスト(ループ
while
…
Emacs Lispでは、そのような砂糖を導入する方法が見つかりませんでした。せいぜい、私はマクロのために作ることができます、それは次のように呼ばれなければなりません
(ループ-リストの場合 (やる-たくさんのもの...)
読みやすさの問題
解決
SchemeとElispはどちらもマクロシステムを持っています。"キーワード" define-syntax
と defmacro
どちらも、ユーザー定義マクロの名前を導入します。
マクロfooが実際のコードで使用されている時点で、次のようになります (foo 1 bar)
マクロエキスパンダーは、指定されたフォームを書き換える方法を決定する必要があります, (foo 1 bar)
, 、ユーザーマクロを含まないより単純な形式に変換します。マクロエキスパンダーは、マクロが定義された時点で定義された関数を呼び出します foo
定義された。つまり指定した関数を呼び出します define-syntax
または defmacro
フォームの表現を使用して, (foo 1 bar)
.表現は、"構文オブジェクト"またはプレーンリストとして使用できます(これはマクロシステムによって異なります)。
これは私の間の類似点についての私の見解です define-syntax
と defmacro
.
ただし、r5RS SchemeとElispのマクロシステムは異なります。
に関連付けられているマクロ拡張子 foo
R5RSスキームでは、次の助けを借りて指定することができます syntax-rules
.これにより、パターンマッチングを使用して書き換えルールを指定することができます(内部的にはsyntax-rulesフォームは関数に評価されます)。その他の違い:マクロ展開アルゴリズムは、R5RSスキームでは、プログラムの他の部分からの名前と衝突する名前を誤って導入するのに役立ちます(ライブラリから歴史的に
名前空間がLispで動作する方法のために、この問題はLispではそれほど大きな問題ではありませんが、間違いを犯す可能性があります。
歴史的にSchemeとElispはどちらも同じマクロ展開アルゴリズムを使用していましたが、その後Schemersは他のアルゴリズムを試し始めました。"Syntax-rules"システムはR5RSで導入されましたが、進化はそこで止まりませんでした。最近では、すべての現代のScheme実装には"syntax-case"システムがあります。
いくつかの実装では、この拡張アルゴリズムをモジュール(Racket、R6RS実装など)で動作させるための作業が行われています。
要するに、Schemeマクロシステムについて読むときは、どのバリアントについて読んでいるかを正確に調べるように注意してください。あなたが制限について読んでいるなら、おそらくあなたは(今ではかなり古い)上のテキストを見つけました syntax-rules
システム。