2012-06-21 32 views
1

鑑於以下功能 -如何編寫一個宏來添加元數據功能

(defn ^:export hi [] (+ 2 3)) 

我想編寫一個宏,這是否 -

(defex hi [] (+ 2 3)) 

defex只是增加^:在函數前面導出元數據。我怎麼做?

編輯 - 我檢查了repl(meta hi)的函數,它給出了零。所以最可能我不想添加metedata,但以上述方式定義一個函數。

感謝, 穆爾塔扎

回答

4

你不想在功能上的元本身,你想要它的變種(或任何clojurescript的相當於那是):

user> (defmacro defex [name & defn-args] 
     `(defn ~(vary-meta name assoc :export true) [email protected])) 
#'user/defex 
user> (defex hi [] "hi") 
#'user/hi 
user> (meta #'hi) 
{:arglists ([]), :ns #<Namespace user>, :name hi, :export true, :line 1, :file "NO_SOURCE_FILE"} 
+0

不同的meta在這裏是正確的答案,謝謝amalloy +1! –

2

您可以使用基本的模板,宏,建立一個功能,並使用高清將其保存在一個VAR

user> (defmacro defex [name args & body] `(def ~name ^{:export true} (fn ~args [email protected]))) 
#'user/defex 
user> (defex hi [] (+ 2 3)) 
#'user/hi 
user> (meta hi) 
{:export true} 
user> 
+0

請檢查我的編輯。 – murtaza52

相關問題