鉴于以下功能 -
(defn ^:export hi [] (+ 2 3))
我想写一个宏来做这个-
(defex hi [] (+ 2 3))
宏defex
只是在函数前面添加 ^:export 元数据。我怎么做?
编辑 - 我检查了 repl (meta hi) 上的函数,它给出了 nil。所以很可能我不想添加元数据,而是以上述方式定义一个函数。
谢谢,穆尔塔萨
鉴于以下功能 -
(defn ^:export hi [] (+ 2 3))
我想写一个宏来做这个-
(defex hi [] (+ 2 3))
宏defex
只是在函数前面添加 ^:export 元数据。我怎么做?
编辑 - 我检查了 repl (meta hi) 上的函数,它给出了 nil。所以很可能我不想添加元数据,而是以上述方式定义一个函数。
谢谢,穆尔塔萨
您不想在函数本身上使用元数据,而是希望在 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"}
您可以使用构建函数并使用 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>