これを行うには、本質的には、別の名前を置き換えるだけで正確に元のマクロに書き換える必要があります(これを行うにはもちろんdefmacro
を使用します)。これは、マクロが値を返さないために可能な唯一の方法ですが、後で評価されるコードを書き出すだけです。
Defでは、コードブロックではなく値に名前をバインドする必要があります。
(DEFシンボルinitは?)
作成し、インターンまたはシンボルの名前と現在の名前空間の値(NS)の名前空間とグローバルVARを見つけ。 initが指定されている場合は評価され、varのルートバインディングは結果の値に設定されます。 initが指定されていない場合、varのルートバインディングは影響を受けません。 defは、defが呼び出された時点でvarがスレッドバインドされていても、常にルートバインディングに適用されます。 defは、var自体(その値ではありません)を生成します。 symbolが既に名前空間にあり、かつ内部変数にマップされていない場合は例外をスローします。
Clojure: Special Formsからマクロは自分のフォームを評価しない:
マクロは構文抽象を考慮して、フォームを操作する関数です。呼び出しの演算子がマクロ関数であるグローバル変数に名前を付けるシンボルである場合、そのマクロ関数が呼び出され、 [斜体鉱山]という形のが渡されます。マクロの戻り値は、その代わりに評価されます。要するにClojure: Evaluation
から
、マクロのポイントは、def
シンボルにバインドするための値を提供することができないので、評価を遅らせることです。
user=> (defmacro def-function [& args] `(defn [email protected]))
#'user/def-function
user=> (def-function g [] 2)
#'user/g
user=> (g)
2
それともclojure.contrib.def/defalias
を使用することができます:あなたがマクロを使用することができます
'clojure.contrib.def'のようなものはもうありません。 https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub