7 clojure
无论如何def在Clojure中以名称定义一个新的宏?defmacro在尝试:refer-clojure :exclude原始版本后我编辑了一个新版本,但无论如何它都使用了内置的定义.
我试图使用以下代码启用Scheme样式的函数定义((def (f x y) ...)as (defn f [x y] ...)).
(defmacro def
[ id & others ]
(if (list? id)
`(defn ~(first id) [~@(rest id)] ~@others)
`(def ~id ~@others)))
Run Code Online (Sandbox Code Playgroud)
def不是宏观,它是一种特殊的形式.它将符号实例化为当前命名空间.你不能重新定义特殊形式,但即使你可以,你会如何获得相同的行为?
最直接的方法是define在def和的基础上编写宏defn.如果你想使用defword,你可以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))
)
Run Code Online (Sandbox Code Playgroud)
但我不确定它是否会破坏其他定义,这取决于def(例如defn).