2012-06-14 23 views

Trả lời

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

Làm thế nào về điều này?

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

Không làm việc cho chức năng hoặc vĩ mô tên tuy nhiên, có lẽ ai đó có thể giúp tôi

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

Mỗi Var trong Clojure đã: tên siêu dữ liệu kèm theo.

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 

Tuy nhiên, thông thường nếu bạn đã có Var, sau đó bạn đã biết tên dù sao, và thường bạn không sử dụng Vars trong một chương trình (ví dụ, bạn chỉ cần vượt qua my-var hoặc my-vui vẻ chứ không phải hơn # 'my-var và #' my-fun).

Không có gì để nhận được Var (hoặc var-name) của hàm hoặc giá trị xảy ra là giá trị của một số Var. Một Var biết giá trị của nó, nhưng không phải là cách khác tròn. Điều đó tất nhiên có ý nghĩa vì, ví dụ, hàm rất giống nhau có thể là giá trị bằng không (đối với các hàm cục bộ) hoặc nhiều vars.

Các vấn đề liên quan