鉴于以下功能 -
(defn ^:export hi [] (+ 2 3))
我想写一个执行此操作的宏 -
(defex hi [] (+ 2 3))
宏defex
只是在函数前面添加^:export元数据。我该怎么做?
编辑 - 我检查了repl上的函数(meta hi),它给出了nil。所以我很可能不想添加metedata,而是以上述方式定义一个函数。
谢谢, 穆尔塔扎
答案 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>