2012-06-14 18 views

答えて

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

これはいかがですか?

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

は、関数やマクロ名では動作しませんClojureの中けれども、多分誰かが私を助けることができる

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

すべてのVaRはあります付属の名前のメタデータを。

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 

しかし、あなたはすでにヴァールを持っている通常ならば、あなたはすでに、とにかく名前を知っており、通常はあなたがプログラムにバールを使用していない(つまり、あなただけではなく、私の-VARや私の-楽しみを渡します# 'my-varと#' my-funよりも)。

関数のVar(またはvar-name)や、ある種のVarの値となる値は、何もありません。 Varはその価値を知っていますが、それ以外の方法はありません。例えば、非常に同じ関数がゼロ(ローカル関数の場合)または複数の変数の値であってもよいため、当然意味がある。

関連する問題