如何编写宏以将元数据添加到函数

mur*_*a52 1 clojure

鉴于以下功能 -

(defn ^:export hi [] (+ 2 3))
Run Code Online (Sandbox Code Playgroud)

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

(defex hi [] (+ 2 3))
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,穆尔塔扎

ama*_*loy 5

你不希望函数本身有元,你希望它在 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"}
Run Code Online (Sandbox Code Playgroud)