2009-08-23 63 views

回答

8

您可以使用宏:

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 
+3

不再有像clojure.contrib.def这样的东西。 https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub 2014-12-15 19:28:22

3

要做到这一点,基本上,你必须完全按照原来的方式重写宏,只需要替换一个不同的名字(你当然会用defmacro来做到这一点)。这是唯一可能的方式,因为宏不会返回值,而只是写出随后要评估的代码。

Def要求将一个名称绑定到一个值而不是一个代码块。

(DEF符号的init?)

创建和实习生或定位一个全局变量与符号的名称和当前命名空间的值(NS)的命名空间。如果提供init,则会对其进行评估,并将var的根绑定设置为结果值。如果未提供init,则var的根绑定不受影响。 def始终适用于根绑定,即使该var在调用def的点处被线程绑定。 def产生var本身(不是它的值)。如果符号已经在命名空间中并且未映射到interned var,则会引发异常。

Clojure: Special Forms

宏不评价自己的形式:

宏是操纵形式,允许语法抽象的语言功能。如果一个调用的操作符是一个名称是一个宏函数的全局变量的符号,那么这个宏函数被调用并且被传递,未评估的操作数形式 [italics mine]。宏的返回值将在其位置进行评估。

Clojure: Evaluation

总之,宏点是延迟的评价,因此它不能提供一个值def绑定到一个符号。

+0

感谢您的解释! – 2009-08-23 04:21:48

29

乍听(线 - )嘈杂,但

(def #^{:macro true} case #'cond) 

作品!