2010-09-21 5 views
4

En Clojure, est-il une façon plus élégante de trouver le nom complet d'une fonction (connue pour avoir méta info) queClojure: nom complet d'une fonction

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

Une solution d'exécution est Champs obligatoires. Les solutions en temps de lecture et de compilation sont les bienvenues.

+0

Est-ce qu'il doit être dans une fonction (plutôt que lors de la compilation dans une macro ou le REPL)? – mikera

Répondre

9

(resolve 'foo) retourne le Var nommé "foo", avec son nom complet.

2

que diriez-vous de la citation de syntaxe? il auto-qualification. `utiliser au lieu de '

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

Très élégant et utile au moment de la lecture. (str 'inc) serait équivalent au nom qualifié complet. Une solution d'exécution? – chris

+0

Que comptez-vous faire avec le résultat? – Belun

+0

Toutes les fonctions n'ont pas de noms entièrement qualifiés (les fonctions anonymes n'ont pas une valeur partielle ....). C'est une chose étrange à rechercher dynamiquement. –

1

La sortie de .toString pourrait vous aider à démarrer:

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

également écrit (carte str) pour obtenir l'utilisation du nom complet (str 'map) –

1

type donne un nom complet, sans tenir compte des méta-informations.

Questions connexes