環境:Clojure 1.4
関数のベクトルから関数のメタデータを動的に取得しようとしています。
(defn #^{:tau-or-pi: :pi} funca "doc for func a" {:ans 42} [x] (* x x))
(defn #^{:tau-or-pi: :tau} funcb "doc for func b" {:ans 43} [x] (* x x x))
(def funcs [funca funcb])
現在、REPLでのメタデータの取得は(ある程度)簡単です。
user=>(:tau-or-pi (meta #'funca))
:pi
user=>(:ans (meta #'funca))
42
user=>(:tau-or-pi (meta #'funcb))
:tau
user=>(:ans (meta #'funcb))
43
:ans
ただし、メタデータから、、、:tau-or-pi
または基本を取得するためにマップを実行しようとすると:name
、例外が発生します。
user=>(map #(meta #'%) funcs)
CompilerException java.lang.RuntimeException: Unable to resolve var: p1__1637# in this context, compiling:(NO_SOURCE_PATH:1)
さらに検索を行った後、2009年の投稿(https://groups.google.com/forum/?fromgroups=#!topic/clojure/VyDM0YAzF4o)から次のアイデアを得ました。
user=>(map #(meta (resolve %)) funcs)
ClassCastException user$funca cannot be cast to clojure.lang.Symbol clojure.core/ns-resolve (core.clj:3883)
defn
マクロ(Clojure 1.4の場合)がマクロVar
のdef
一部にメタデータを配置していることを知っているdefn
ので、単純な(meta #'funca)
ものが機能していますが、関数のメタデータを動的に取得する方法はありますか(map
上記の例のように)?
構文的に何かが足りないかもしれませんが、誰かが私を正しい方向または正しいアプローチに向けることができれば、それは素晴らしいことです。
ありがとう。