2012-06-21 27 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

相关问题