9

変数の文字列表現を取得したい。例えば、

(def my-var {})

"my-var"シンボルから文字列を取得する方法はmy-var?と

(defn my-fun [] ...)

"my-fun"関数から文字列を取得する方法はmy-fun

4

3 に答える 3

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
于 2012-06-14T09:29:04.827 に答える
11

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はその値を知っていますが、その逆はありません。もちろん、これは理にかなっています。たとえば、まったく同じ関数がゼロ(ローカル関数の場合)または複数の変数の値である可能性があるためです。

于 2013-07-15T11:47:09.757 に答える
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"

関数名やマクロ名では機能しませんが、誰かが私を助けてくれるかもしれません

=> (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)
于 2012-06-15T06:13:57.623 に答える