2017-05-22 26 views

答えて

5

リーダーマクロは、通常のマクロではできない方法で言語の構文を変更します(たとえば、@foo(deref foo)になります)。通常のマクロではカッコを取り除くことはできません。 (@ foo)のようなものをする)。 replのreadパス(sourceを参照)で実装されているため、リーダーマクロと呼ばれています。

クロージャーの開発者は普通のマクロしか作成しませんが、明示的に考慮する必要はありませんが、多くのリーダーマクロを使用します。

リーダマクロの全リストはhttps://clojure.org/reference/readerであり、@'#{}のような一般的なものが含まれています。

Clojureの(いくつかの他のLispとは違って)、ユーザー定義のリーダーマクロをサポートしていますが、tagged literalsを経由して、読者に組み込まれたいくつかの拡張(例えば#instまたは#uuid)があるしない

3

TL; DR *

マクロ[通常のマクロ]は評価中に展開され(REPLのE)、記号に結び付けられ、lispオブジェクトで動作し、フォームの最初の「関数」部分に現れます。 Clojure、およびすべてのlispは、新しいマクロの定義を可能にします。

リーダマクロは、評価の前に1文字であり、リーダからすべてのlispオブジェクトが放出される前に文字列を操作し、最初の文字列または "関数" 、フォームの一部。 Clojureは、他のいくつかのリスプとは異なり、Clojureコンパイラ自体を編集することなく、新しいリーダマクロを定義することはできません。

複数の単語:

ノーマル非リーダーマクロ、または単に "マクロ" は、Lispオブジェクトを操作します。検討:

(and 1 b :x)

andマクロは、1つの値が1であり、他方はシンボルb(NOT Bの値)とキーワード:xからなるリストである、二つの値と呼ぶことにします。 andマクロが扱っているものはすべてすでにlisp(Clojure)の値です。

マクロ展開は、マクロがリストの先頭にある場合にのみ発生します。 (and 1 2)andマクロを展開します。 (list and)は、「マクロの値を取ることができません」というエラーを返します。

文字列をIn Clojureに変換することはリーダブルです。読者マクロは、読者、読者、テキストストリームをlispオブジェクトに変換し、動作させます。ClojureのlispリーダーへのディスパッチはLispReader.javaです。 Alejandro C.が述べたように、Clojureはリーダマクロの追加をサポートしていません。

リーダーマクロは1つの文字です。 (つまり、すべてのLispのために真であるかどうかは知りませんが、Clojureのの現在の実装では、単一文字のリーダーマクロをサポートしています。)

リーダーマクロは、フォームの任意の時点で存在することができます。 'マクロが正常であれば、ティックはlispオブジェクトになる必要があり、コードconj、空のベクトル、記号'、そして最後にシンボルaのリストになる必要があります。しかし、今では、エバリュエーションルールでは、'を単独で評価する必要があります。読者の代わりに、'は、quoteと続く完全なs-expをラップして、評価者に返される値がconjのリスト、空のベクトル、およびquoteのリストに続いてaのリストであるようにします。今quoteは、リストの先頭であり、それは引用何のための評価ルールを変更することができます。 、まもなく読者マクロを話す

1

は、低レベルの機能です。 (quitingともう少しだけ@)ので、それらのいくつかがある理由です。多くの読者の規則を持つことは、あらゆる言語を混乱に変えるでしょう。

正規マクロが広くClojureのに使用されるツールです。開発者は、Clojureの中心的な開発者でない場合は、あなた自身のレギュラーマクロを書くことはできますが、読者は作成しないでください。

あなたのタグ付きリテラルは、読者のルールの代用として常に使用できます。たとえば、#inst "2017"Dateインスタンスなどを返します。

関連する問題