2010-09-21 2 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

ответ

9

(resolve 'foo) возвращает Var с именем "Foo", с его полным именем.

2

как насчет синтаксиса-цитирования? он делает авто-квалификацию. использовать `вместо '

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

Очень элегантный и полезный во время чтения. (str 'inc) будет эквивалентно полностью квалифицированному имени. Любое решение во время выполнения? – chris

+0

Что вы планируете делать с результатом? – Belun

+0

Не все функции имеют полностью квалифицированные имена (анонимные функции не являются частичными ....). Это странная вещь для динамического поиска. –

1

Выход .ToString может заставить вас начать:

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

также написана (карта str), чтобы получить полное использование имени (str 'map) –

1

type дает полное имя, независимо от метаинформации.

Смежные вопросы