環境: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上記の例のように)?
構文的に何かが足りないかもしれませんが、誰かが私を正しい方向または正しいアプローチに向けることができれば、それは素晴らしいことです。
ありがとう。