概念レベルでは、LISP(および方言)のマクロは(リストとして)コードを取り、別のコードを(リストとして)返します。マクロでのリストとバックティックの違い
(defmacro zz [a] (list print a))
;macroexpand says : (#<core$print [email protected]> "Hello")
しかし、Clojureの中で、これはまた、以下のように書くことができる:
(defmacro zz [a] `(print ~a))
;macroexpand says : (clojure.core/print "Hello")
私はここでの違いについて正確にわからないとどのべき簡単なマクロは可能性の原則の上に基づいて
好ましい方法である。最初のものは単純に見えますが、リストを返すようになっていて、バックティックのような奇妙な文字の使用は避けてください。
これは実際には '(list \' print a) 'と似ていますが、' 'print''はローカルではなく' 'clojure.core/print''を参照して'または全くバインドしない(名前空間の ':refer-clojure'から除外したとします)。一方、 '\' print'は 'clojure.core/print'に直接展開されるので、どんな文脈でも曖昧ではなく正しいです。 – amalloy
@amalloyご回答いただきありがとうございます。ご回答いただきありがとうございます。私はちょうど '' '(print〜a)'のマクロ展開を(スライム経由で)しようとしました。 )) ' - 'ああ、しかし、あなたは、変換前のフォームが '' 'print''を持つことに似ていると言っていますか? –
SOがバックティックキャラクターの一部を食べているので、私はあなたのレスポンスをうまく読み取れませんが、スライムはネームスペースを隠しています(そしてマクロエクスパンドは必要ありません)。式に '' \ '(print〜a)'と入力するだけで式を引用すれば、 '' clojure.core/seq(clojure.core/concat(clojure.core/list(quote clojure.core/print))(clojure.core/list a))) 'を実行します。 'clojure.core/print'は重要な違いです。 – amalloy