2010-11-21 59 views
7

是否有無法在Clojure中以名稱def定義一個新宏? I defmacro在嘗試:refer-clojure :exclude之後嘗試了一個新的,但它仍然使用了內置的定義。在Clojure中重新定義「def」

我試圖使用下面的代碼來啓用Scheme樣式的函數定義((def (f x y) ...)作爲(defn f [x y] ...))。

(defmacro def 
    [ id & others ] 
    (if (list? id) 
     `(defn ~(first id) [[email protected](rest id)] [email protected]) 
     `(def ~id [email protected]))) 

回答

6

def不是宏,它是一種特殊形式。它在當前名稱空間中實現一個符號。你不能重新定義特殊的表格,但即使你可以,你會如何得到相同的行爲?

最直接的方法是在defdefn的基礎上編寫define宏。如果你想使用def的話,你可以寫一個包裝replace-my-def-with-normal-def周圍所有的模塊,即

(replace-my-def-with-normal-def 

    (def x 0) 
    (def y (inc x)) 
    (def z (inc y)) 
    (def (my-func a b) (println a b)) 

) 

,但我不知道它會不會破壞其它的定義,這取決於def(例如,defn )。

+4

您無法重新定義特殊形式。 – 2010-11-21 15:44:47

2

你可以創建一個名稱爲特殊形式的宏(比如if),但它不會幫助你。特殊形式在宏之前被評估,因此如果你有一個宏和一個特殊形式的相同名字,那麼特殊形式總是被使用。更多的信息在這裏http://clojure.org/evaluation