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

Clojure 如何编写宏向函数添加元数据,clojure,Clojure,给定以下函数- (defn ^:export hi [] (+ 2 3)) 我想写一个宏来实现这一点- (defex hi [] (+ 2 3)) 宏defex只是在函数前面添加了^:导出元数据。我该怎么做 编辑-我检查了repl meta hi上的函数,它给出了nil。所以我可能不想添加metedata,而是用上面的方式定义一个函数 谢谢, Murtaza您可以使用基本模板宏来构建函数,并使用def将其保存在变量中 user> (defmacro defex [name args &

给定以下函数-

(defn ^:export hi [] (+ 2 3))
我想写一个宏来实现这一点-

(defex hi [] (+ 2 3))
宏defex只是在函数前面添加了^:导出元数据。我该怎么做

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

谢谢,
Murtaza

您可以使用基本模板宏来构建函数,并使用def将其保存在变量中

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> 

您可以使用基本模板宏来构建函数,并使用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> 

您不希望meta出现在函数本身上,而是希望它出现在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"}

您不希望meta出现在函数本身上,而是希望它出现在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"}