因此,从Clojure macro to create a synonym for a function开始,我发现def不能用来定义宏的同义词。下面是我试过Clojure不允许的例子。定义了Clojure宏的同义词
;(def def-function defn)
;(def case cond)
;(def function fn)
是否可以为Clojure中的宏定义同义词/别名?它需要使用defmacro吗?
因此,从Clojure macro to create a synonym for a function开始,我发现def不能用来定义宏的同义词。下面是我试过Clojure不允许的例子。定义了Clojure宏的同义词
;(def def-function defn)
;(def case cond)
;(def function fn)
是否可以为Clojure中的宏定义同义词/别名?它需要使用defmacro吗?
您可以使用宏:
user=> (defmacro def-function [& args] `(defn [email protected]))
#'user/def-function
user=> (def-function g [] 2)
#'user/g
user=> (g)
2
或者你可以使用clojure.contrib.def/defalias
:
user=> (use 'clojure.contrib.def)
nil
user=> (defalias def-function defn)
#'user/def-function
user=> (def-function g [] 2)
#'user/g
user=> (g)
2
要做到这一点,基本上,你必须完全按照原来的方式重写宏,只需要替换一个不同的名字(你当然会用defmacro
来做到这一点)。这是唯一可能的方式,因为宏不会返回值,而只是写出随后要评估的代码。
Def要求将一个名称绑定到一个值而不是一个代码块。
(DEF符号的init?)
创建和实习生或定位一个全局变量与符号的名称和当前命名空间的值(NS)的命名空间。如果提供init,则会对其进行评估,并将var的根绑定设置为结果值。如果未提供init,则var的根绑定不受影响。 def始终适用于根绑定,即使该var在调用def的点处被线程绑定。 def产生var本身(不是它的值)。如果符号已经在命名空间中并且未映射到interned var,则会引发异常。
宏不评价自己的形式:
宏是操纵形式,允许语法抽象的语言功能。如果一个调用的操作符是一个名称是一个宏函数的全局变量的符号,那么这个宏函数被调用并且被传递,未评估的操作数形式 [italics mine]。宏的返回值将在其位置进行评估。
总之,宏点是延迟的评价,因此它不能提供一个值def
绑定到一个符号。
感谢您的解释! – 2009-08-23 04:21:48
乍听(线 - )嘈杂,但
(def #^{:macro true} case #'cond)
作品!
不再有像clojure.contrib.def这样的东西。 https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub 2014-12-15 19:28:22