首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure:如何获取函数的元数据?

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

Stack Overflow用户
提问于 2009-11-17 20:03:05
回答 2查看 3.5K关注 0票数 11

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

previous question中,我了解到这可以使用诸如^#'func_name (获取var对象的元数据)之类的东西来实现。但是我没有设法以编程的方式做到这一点,因为func-name事先是不知道的。

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

代码语言:javascript
复制
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}

怎么做呢?我已经尝试了许多变体,但都不能奏效。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-17 20:22:33

你在找metans-resolve

代码语言:javascript
复制
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."}
票数 9
EN

Stack Overflow用户

发布于 2009-11-18 01:41:27

从技术上讲,函数目前不能在Clojure中包含元数据:

http://www.assembla.com/spaces/clojure/tickets/94-GC--Issue-90---%09-Support-metadata-on-fns

然而,绑定到函数的var可能会,看起来这就是您在ns-resolve中找到的。(meta last-func)也可以。因为last-func本身就是var本身,所以^#'last-func (它是(meta (var (引用last-func)的简写)有一个多余的var取消引用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1748408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档