Function 反思Clojure函数名

Function 反思Clojure函数名,function,reflection,clojure,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))?看起来我可以使用str: (str foo) => "#'my-project/foo" 看起来我可以使用str:

如何在Clojure中使用反射来提取计算结果为函数的符号的函数名

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

关于
(map:name(:members(r/reflect foo))

看起来我可以使用
str

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

看起来我可以使用
str

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

否,请不要使用
str
,因为它的行为不同。在我的例子中,我得到的是:

user=> (defn foo [x] x)
#'user/foo
user=> (str foo)
"user$foo@7cb20059"
相反,使用
meta
var
调用的组合:

(-> foo var meta)
此代码返回变量元数据的映射。键
:name
将函数名保存为字符串:

(-> foo var meta :name)
foo
如果还希望有ns的名称,请执行以下操作:

user=> (-> foo var meta :ns ns-name)
user
它获取名称空间对象并以字符串形式返回其名称和
ns name
函数


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

否,请不要使用
str
,因为它的行为不同。在我的例子中,我得到的是:

user=> (defn foo [x] x)
#'user/foo
user=> (str foo)
"user$foo@7cb20059"
相反,使用
meta
var
调用的组合:

(-> foo var meta)
此代码返回变量元数据的映射。键
:name
将函数名保存为字符串:

(-> foo var meta :name)
foo
如果还希望有ns的名称,请执行以下操作:

user=> (-> foo var meta :ns ns-name)
user
它获取名称空间对象并以字符串形式返回其名称和
ns name
函数

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

的可能副本