如何编写宏来向函数添加元数据

时间:2012-06-21 18:42:32

标签: clojure

鉴于以下功能 -

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

我想写一个执行此操作的宏 -

(defex hi [] (+ 2 3))

defex只是在函数前面添加^:export元数据。我该怎么做?

编辑 - 我检查了repl上的函数(meta hi),它给出了nil。所以我很可能不想添加metedata,而是以上述方式定义一个函数。

谢谢, 穆尔塔扎

2 个答案:

答案 0 :(得分:4)

你不希望函数本身有元,你想要它在var上(或者clojurescript的等价物):

user> (defmacro defex [name & defn-args]
        `(defn ~(vary-meta name assoc :export true) ~@defn-args))
#'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"}

答案 1 :(得分:2)

您可以使用构建函数的基本模板宏,并使用def将其保存在var

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