在Clojure中重新定义"def"

7 clojure

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

我试图使用以下代码启用S​​cheme样式的函数定义((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)

ffr*_*end 7

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

最直接的方法是definedef和的基础上编写宏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).

  • 您无法重新定义特殊表格. (4认同)