2012-06-14 12 views

Respuesta

12
user=> (def my-var {}) 
#'user/my-var 
user=> (defn my-fun []) 
#'user/my-fun 
user=> (name 'my-var) 
"my-var" 
user=> (name 'my-fun) 
"my-fun" 
user=> (doc name) 
------------------------- 
clojure.core/name 
([x]) 
    Returns the name String of a string, symbol or keyword. 
nil 
1

¿Qué le parece esto?

(defn symbol-as-string [sym] (str (second `(name ~sym))) 

=> (def my-var {}) 
#'user/my-var 
=> (symbol-as-string my-var) 
"my-var" 
=> (symbol-as-string 'howdy) 
"howdy" 

no funciona para la función o macro nombres, sin embargo, tal vez alguien me puede ayudar a

=> (symbol-as-string map) 
"[email protected]" 
=> (symbol-as-string defn) 
java.lang.Exception: Can't take value of a macro: #'clojure.core/defn (NO_SOURCE_FILE:31) 
7

Cada Var, en Clojure ha: adosada nombre de metadatos.

user> (def my-var {}) 
#'user/my-var 
user> (:name (meta #'my-var)) 
my-var 
user> (let [a-var #'my-var] 
     (:name (meta a-var))) 
my-var 

Sin embargo, por lo general, si usted ya tiene el Var, entonces ya conoce el nombre de todos modos, y por lo general no utilizar Vars en un programa (es decir, que acaba de pasar mi-var o mi-diversión en lugar que # 'my-var y #' my-fun).

No hay nada para obtener el Var (o var-name) de una función o un valor que resulta ser el valor de algunos Var. Un Var sabe su valor, pero no al revés. Eso, por supuesto, tiene sentido ya que, por ejemplo, la misma función puede ser el valor de cero (para funciones locales) o múltiples vars.

Cuestiones relacionadas