2012-06-14 14 views

cevap

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

Bu nasıl? adı meta ekli:

(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" 

belki birisi bana

=> (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

Clojure her Var olan yardımcı olabilir, gerçi işlev veya makro adları için çalışmaz.

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 

Ancak, zaten Var sahip genellikle eğer, o zaman zaten yine adını biliyor ve genellikle bir programda Vars kullanmayın (yani, sadece ziyade benim-var ya da benim-fun geçmesi # 'my-var ve #' eğlencemden). bir fonksiyonu ya da bazı Var değeri olur bir değer Var almak için hiçbir şey (ya da var-ad) var

. A Var, değerini biliyor, ancak diğer yoldan değil. Tabii ki bu, örneğin, aynı fonksiyonun sıfır (lokal fonksiyonlar için) veya çoklu varyasyonların değeri olabileceğinden anlamlıdır.

İlgili konular