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) 

作品!