1

以下の関数が与えられた-

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

これを行うマクロを書きたいのですが-

(defex hi [] (+ 2 3))

マクロdefexは、関数の前に^:exportメタデータを追加するだけです。それ、どうやったら出来るの?

編集-repl(meta hi)で関数をチェックしたところ、nilが返されました。したがって、おそらく私はmetedataを追加したくはありませんが、上記の方法で関数を定義します。

ありがとう、ムルタザ

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 に答える