以下の関数が与えられた-
(defn ^:export hi [] (+ 2 3))
これを行うマクロを書きたいのですが-
(defex hi [] (+ 2 3))
マクロdefexは、関数の前に^:exportメタデータを追加するだけです。それ、どうやったら出来るの?
編集-repl(meta hi)で関数をチェックしたところ、nilが返されました。したがって、おそらく私はmetedataを追加したくはありませんが、上記の方法で関数を定義します。
ありがとう、ムルタザ
以下の関数が与えられた-
(defn ^:export hi [] (+ 2 3))
これを行うマクロを書きたいのですが-
(defex hi [] (+ 2 3))
マクロdefexは、関数の前に^:exportメタデータを追加するだけです。それ、どうやったら出来るの?
編集-repl(meta hi)で関数をチェックしたところ、nilが返されました。したがって、おそらく私はmetedataを追加したくはありませんが、上記の方法で関数を定義します。
ありがとう、ムルタザ
関数自体にメタが必要ではなく、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>