无论如何在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)))
答案 0 :(得分:7)
def
不是宏,它是一种特殊形式。它将符号实例化为当前命名空间。你不能重新定义特殊形式,但即使你可以,你会如何获得相同的行为?
最直接的方法是在define
和def
的基础上编写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
。