私はClojureには比較的新しいので、リーダーマクロとの正規のマクロとの違いについて私の心を包み込むことはできません。「通常」マクロと「読者」マクロの違いは何ですか?
どのような状況で、どちらか一方を使用し、その理由は何ですか?
私はClojureには比較的新しいので、リーダーマクロとの正規のマクロとの違いについて私の心を包み込むことはできません。「通常」マクロと「読者」マクロの違いは何ですか?
どのような状況で、どちらか一方を使用し、その理由は何ですか?
リーダーマクロは、通常のマクロではできない方法で言語の構文を変更します(たとえば、@foo
は(deref foo)
になります)。通常のマクロではカッコを取り除くことはできません。 (@ foo)
のようなものをする)。 replのread
パス(sourceを参照)で実装されているため、リーダーマクロと呼ばれています。
クロージャーの開発者は普通のマクロしか作成しませんが、明示的に考慮する必要はありませんが、多くのリーダーマクロを使用します。
リーダマクロの全リストはhttps://clojure.org/reference/readerであり、@
'
と#{}
のような一般的なものが含まれています。
Clojureの(いくつかの他のLispとは違って)、ユーザー定義のリーダーマクロをサポートしていますが、tagged literalsを経由して、読者に組み込まれたいくつかの拡張(例えば#inst
または#uuid
)があるしない
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
は、リストの先頭であり、それは引用何のための評価ルールを変更することができます。 、まもなく読者マクロを話す
は、低レベルの機能です。 (quitingともう少しだけ@
)ので、それらのいくつかがある理由です。多くの読者の規則を持つことは、あらゆる言語を混乱に変えるでしょう。
正規マクロが広くClojureのに使用されるツールです。開発者は、Clojureの中心的な開発者でない場合は、あなた自身のレギュラーマクロを書くことはできますが、読者は作成しないでください。
あなたのタグ付きリテラルは、読者のルールの代用として常に使用できます。たとえば、#inst "2017"
はDate
インスタンスなどを返します。