Function 反思Clojure函数名
如何在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:
(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版本,因此更具可维护性。的可能副本