2009-08-23 7 views
11

したがって、Clojure macro to create a synonym for a functionの後に、defはマクロの同義語を定義するために使用できないことがわかりました。以下は、私が試したClojureが許さない例です。Clojureマクロの同義語を定義します

;(def def-function defn) 
;(def case cond) 
;(def function fn) 

Clojureでマクロのシノニム/エイリアスを定義することはできますか?それはdefmacroを使う必要がありますか?

答えて

8

user=> (use 'clojure.contrib.def) 
nil 
user=> (defalias def-function defn) 
#'user/def-function 
user=> (def-function g [] 2) 
#'user/g 
user=> (g) 
2 
+3

'clojure.contrib.def'のようなものはもうありません。 https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub

3

これを行うには、本質的には、別の名前を置き換えるだけで正確に元のマクロに書き換える必要があります(これを行うにはもちろん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を使用することができます:あなたがマクロを使用することができます

+0

ありがとうございました! –

29

はうるさいけど

(def #^{:macro true} case #'cond) 

作品(ライン - )を聞こえるかもしれません!

関連する問題