2010-09-21 38 views
4

在Clojure中的完全合格的名字,难道还有比Clojure的:一个功能

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

一个运行时的解决办法是找到一个函数(已知有元信息)的全名的更优雅的方式需要。欢迎阅读和编译时间解决方案。

+0

它是否必须在函数中(而不是编译时在宏或REPL中)? – mikera 2010-09-21 15:30:31

回答

9

(resolve 'foo)返回瓦尔名为‘foo’,其完全限定名称。

2

语法引用如何?它具有自动资格。使用',而不是'

user=> `(inc) 
(clojure.core/inc) 
user=> `(fn) 
(clojure.core/fn) 
+0

非常优雅,在阅读时很有用。 (str'inc)将等同于完全限定名称。任何运行时解决方案? – chris 2010-09-21 16:13:28

+0

你打算如何处理结果? – Belun 2010-09-21 16:22:52

+0

并非所有函数都有完全限定名称(匿名函数不具有部分....)。动态查找这是一件奇怪的事情。 – 2010-09-21 16:34:24

1

的ToString的输出可以让你开始:

user=> (.toString map) 
"[email protected]" 
+1

也写成(str映射)得到完全限定的名字use(str'map) – 2010-09-22 17:54:36

1

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