2

define-syntaxELispのSchemeとの類似点はありますか? ではdefine-syntaxいくつかのキーワードを指定できますが、elisp ではできdefmacroないようです。編集:私はあなたをよく理解していないようです、または私の質問は明確ではありません. スキームでは、次のような予約語でマクロを定義することができます

(いくつかのリストをループforするin

(ループwhile…</p>

Emacs Lisp では、そのような砂糖を導入する方法がないことがわかりました。せいぜい、次のように呼び出す必要があるマクロを作成できます

(リストのループ (do-a lot of things…)

読みやすさが重要

4

1 に答える 1

6

Scheme と Elisp の両方にマクロ システムがあります。「キーワード」define-syntaxdefmacro両方は、ユーザー定義マクロの名前を導入します。

マクロ 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 は他のアルゴリズムの実験を開始しました。「構文規則」システムは R5RS で導入されましたが、進化はそこで止まりませんでした。最近のすべての最新の Scheme 実装には、「構文ケース」システム (の変形) があります。

一部の実装では、この展開アルゴリズムがモジュール (Racket、R6RS 実装など) で機能するように作業が行われています。

要するに、Scheme マクロ システムについて読むときは、読んでいるバリアントを正確に調べるように注意してください。制限について読んでいる場合は、(現在ではかなり古い)syntax-rulesシステムに関するテキストを見つけた可能性が高いでしょう。

于 2012-05-19T09:59:59.647 に答える