Clojure:如何获取函数的元数据?

Clojure:如何获取函数的元数据?,clojure,Clojure,我正在尝试获取所有内置Clojure函数的元数据 在中,我了解到这可以通过使用类似^#'func_name(获取var对象的元数据)的方法实现。但我并没有通过编程实现,因为func的名称事先不知道 例如,尝试获取clojure.core中最后一个函数的元数据: user=> (use 'clojure.contrib.ns-utils) nil user=> (def last-func (last (vars clojure.core))) user=> last-func

我正在尝试获取所有内置Clojure函数的元数据

在中,我了解到这可以通过使用类似
^#'func_name
(获取var对象的元数据)的方法实现。但我并没有通过编程实现,因为func的名称事先不知道

例如,尝试获取clojure.core中最后一个函数的元数据:

user=> (use 'clojure.contrib.ns-utils)
nil
user=> (def last-func (last (vars clojure.core)))

user=> last-func
zipmap

;The real metadata (zipmap is hardcoded)
user=> ^#'zipmap
{:ns #<Namespace clojure.core>, :name zipmap, :file "clojure/core.clj", :line 1661, :arglists ([keys vals]), :doc "Returns a map .."}

;Try to get programmatically, but get shit
user=> ^#'last-func
{:ns #<Namespace user>, :name last-func, :file "NO_SOURCE_PATH", :line 282}
user=>(使用“clojure.contrib.ns utils”)
无
user=>(def last func(last(vars clojure.core)))
user=>last func
zipmap
;真实元数据(zipmap是硬编码的)
用户=>^#'zipmap
{:ns#,:name zipmap,:file“clojure/core.clj”,:第1661行,:arglist([keys vals]),:doc“返回一个映射…”
;尝试以编程方式获取,但获取狗屎
用户=>^#'最后一个函数
{:ns#,:name last func,:file“NO_SOURCE_PATH”,:line 282}

怎样才能做到呢?我已经尝试了许多变体,但都没有成功。

您正在寻找
meta
ns resolve

user=> (let [fun "map"] (meta (ns-resolve 'clojure.core (symbol fun))))
{:ns #<Namespace clojure.core>, :name map, :file "clojure/core.clj", :line 1705, :arglists ([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls]), :doc "Returns a lazy sequence consisting of the result of applying f to the\n  set of first i tems of each coll, followed by applying f to the set\n  of second items in each coll, until any one of the colls is\n  exhausted.  Any remaining items in other colls are ignored. Function\n  f should accept number-of-colls arguments."}
user=>(让[fun”映射](meta(ns解析'clojure.core(symbol fun)))

{:ns#,:name map,:文件“clojure/core.clj”,第1705行,:arglists([f coll][f c1 c2][f c1 c2 c3][f c1 c2 c3&colls]),doc“返回一个惰性序列,该序列由将f应用于每个coll的\n第一个项集,然后将f应用于每个coll中的\n第二个项集的结果组成,直到任何一个coll耗尽。忽略其他coll中的任何剩余项。函数\n f应接受coll参数的数目。”}
从技术上讲,当前Clojure中不能有元数据:


然而,绑定到函数的变量可能会出现,这似乎是您在ns resolve中发现的。(meta last func)也会起作用。因为last func是变量本身,^#'last-func(meta(var(quote last func))有一个冗余的变量取消引用。

谢谢!的确,^(ns resolve'clojure.core last func)实现这一点我找到了另一种使用“intern”函数的方法:^(intern'clojure.core last func)这是一个危险的解决方案:
user=>(meta(intern'clojure.core(带有meta'count:meta:data})){:ns#,:name count,:meta:data}
所以要小心你的符号来自何处。我仍然建议使用ns resolve而不是intern.No。(meta last func)不起作用。请自己试试看。它返回nil
clojure.contrib.ns utils/vars
返回符号列表而不是变量列表,这就是它不起作用的原因。