环境: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
或 basic: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
上面的示例)?
也许我在语法上遗漏了一些东西,但如果有人能指出我正确的方向或正确的方法,那就太好了。
谢谢。