因此,從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