1

鉴于以下功能 -

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

我想写一个宏来做这个-

(defex hi [] (+ 2 3))

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

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

谢谢,穆尔塔萨

4

2 回答 2

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"}
于 2012-06-21T19:22:32.090 回答
1

您可以使用构建函数并使用 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> 
于 2012-06-21T19:00:16.807 回答