反思Clojure功能名称

时间:2018-01-19 08:03:10

标签: function reflection clojure

如何在Clojure中使用反射来提取符号函数的函数名称?

(require '[clojure.reflect :as r])
(defn foo [x] x)
(r/reflect foo)
=> {#clojure.reflect.Field ... 'gobbledygook}

关于(map :name (:members (r/reflect foo)))的事情?

2 个答案:

答案 0 :(得分:6)

不,请不要使用str因为它的行为不同。在我的例子中,这是我所拥有的:

user=> (defn foo [x] x)
#'user/foo
user=> (str foo)
"user$foo@7cb20059"

相反,请使用metavar来电的组合:

(-> foo var meta)

此代码返回变量元数据的映射。键:name将函数名称保存为字符串:

(-> foo var meta :name)
foo

如果您还想拥有ns的名称,请执行以下操作:

user=> (-> foo var meta :ns ns-name)
user

它获取名称空间对象,并以ns-name函数作为字符串返回其名称。

这些方法不依赖于Clojure或REPL版本,因此更易于维护。

答案 1 :(得分:0)

看起来我可以使用str

(str foo)
=> "#'my-project/foo"