2010-09-21 51 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給出了一個完全限定的名稱,無論元信息如何。