我想得到一个变量的字符串表示。例如,
(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,那么无论如何您已经知道名称,并且通常您不会在程序中使用 Vars(即,您只需传递 my-var 或 my-fun 而不是 #'my-var 和#'我的乐趣)。
没有什么可以获取函数的 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)