反思Clojure功能名称

Pet*_*ron 0 reflection function clojure

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

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

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

Iva*_*aev 6

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

user=> (defn foo [x] x)
#'user/foo
user=> (str foo)
"user$foo@7cb20059"
Run Code Online (Sandbox Code Playgroud)

相反,使用metavar调用的组合:

(-> foo var meta)
Run Code Online (Sandbox Code Playgroud)

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

(-> foo var meta :name)
foo
Run Code Online (Sandbox Code Playgroud)

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

user=> (-> foo var meta :ns ns-name)
user
Run Code Online (Sandbox Code Playgroud)

它获取命名空间对象并将该ns-name函数作为字符串返回其名称.

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