Clojure: 函数的完全限定名称

6

在Clojure中,是否有一种更优雅的方法来查找函数的完全限定名称(已知具有元信息)而不是

(defn fully-qualified-name [fn]
  (let [fn-meta (meta fn )
        fn-ns (ns-name (:ns fn-meta))
        ]
    (str fn-ns "/" (:name fn-meta))))

需要一个运行时解决方案。欢迎使用读取时间和编译时间解决方案。

它必须在函数中吗(而不是在编译时的宏或REPL中)? - mikera
4个回答

11

(resolve 'foo)会返回名为“foo”的变量,以及该变量的完全限定名称。


5
语法引用怎么样?它会自动限定。使用 ` 而不是 '。
user=> `(inc)
(clojure.core/inc)
user=> `(fn)
(clojure.core/fn)

非常优雅和有用的读取时特性。 (str inc)`相当于完全限定名称。 有任何运行时解决方案吗? - chris
你打算用这个结果做什么? - Belun
并非所有函数都有完全限定名称(匿名函数没有部分...)。这是一件奇怪的动态查找事情。 - Nicolas Oury
@Nicolas 我修改了问题以澄清对于具有完全限定名称的函数的解决方案是足够的。 - chris

2

type 提供了一个完全限定的名称,无论元信息如何。


1

可以从.toString的输出开始:

user=> (.toString map)
"clojure.core$map@11af7bb"

1
也可以写成(str map)来获取完全限定名,请使用(str `map)。 - Arthur Ulfeldt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接