変数の文字列表現を取得したい。例えば、
(def my-var {})
"my-var"
シンボルから文字列を取得する方法はmy-var
?と
(defn my-fun [] ...)
"my-fun"
関数から文字列を取得する方法はmy-fun
?
変数の文字列表現を取得したい。例えば、
(def my-var {})
"my-var"
シンボルから文字列を取得する方法はmy-var
?と
(defn my-fun [] ...)
"my-fun"
関数から文字列を取得する方法はmy-fun
?
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
ClojureのすべてのVarには:nameメタデータが添付されています。
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を持っている場合は、とにかく名前を知っているはずです。通常、プログラムでVarを使用することはありません(つまり、#'my-varではなくmy-varまたはmy-funを渡すだけです。 #'my-fun)。
関数のVar(またはvar-name)またはあるVarの値である値を取得することは何もありません。Varはその値を知っていますが、その逆はありません。もちろん、これは理にかなっています。たとえば、まったく同じ関数がゼロ(ローカル関数の場合)または複数の変数の値である可能性があるためです。
これはどう?
(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"
関数名やマクロ名では機能しませんが、誰かが私を助けてくれるかもしれません
=> (symbol-as-string map)
"clojure.core$map@152643"
=> (symbol-as-string defn)
java.lang.Exception: Can't take value of a macro: #'clojure.core/defn (NO_SOURCE_FILE:31)