如何在Clojure中使用反射来提取符号函数的函数名称?
(require '[clojure.reflect :as r])
(defn foo [x] x)
(r/reflect foo)
=> {#clojure.reflect.Field ... 'gobbledygook}
关于(map :name (:members (r/reflect foo)))
的事情?
答案 0 :(得分:6)
不,请不要使用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版本,因此更易于维护。
答案 1 :(得分:0)
看起来我可以使用str
:
(str foo)
=> "#'my-project/foo"