在Clojure中重新定义“def”

时间:2010-11-21 14:20:00

标签: clojure

无论如何在Clojure中以def的名称定义一个新的宏?尝试defmacro原作后我:refer-clojure :exclude编了一个新内容,但无论如何都使用了内置定义。

我尝试使用以下代码启用Scheme样式的函数定义((def (f x y) ...)(defn f [x y] ...))。

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

2 个答案:

答案 0 :(得分:7)

def不是宏,它是一种特殊形式。它将符号实例化为当前命名空间。你不能重新定义特殊形式,但即使你可以,你会如何获得相同的行为?

最直接的方法是在definedef的基础上编写defn宏。如果你想使用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)。

答案 1 :(得分:3)

您可以使用特殊表单的名称(如果)创建一个宏,但它对您没有帮助。特殊形式在宏之前进行评估,因此如果您有一个宏和一个同名的特殊形式,将始终使用特殊形式。更多信息请http://clojure.org/evaluation