我在做数学游戏。为了存储数学问题,我使用以下记录:
(defrecord Question [args operator]
Object
(toString [self]
(apply str (drop-last 2 (interleave args (repeat \space) (repeat operator) (repeat \space))))))
该toString
“办法”的指定参数和操作转换成缀操作字符串。
我的问题是,当我尝试将函数(如*
)转换为字符串时,我得到了合格的,符合Java的符号名称:
(str *)
"clojure.core$_STAR_@a2a3e7"
我想要的只是将符号从字面上转换为字符串,因此*
函数yields "*"
。我能做的最好的事情就是使用从函数符号到字符串的预定义映射;但理想情况下,我不需要地图,而直接生成符号的字符串版本。
这可能吗?
您将通过评估获得的符号'*
与通过评估可获得的功能相混淆*
:
'*
;;=> *
*
;;=> #function[clojure.core/*]
当然,'*
这不是获得符号的唯一方法*
。'
可以使用等效的quote
特殊形式来代替使用reader宏,或者可以使用该symbol
函数根据字符串创建符号,或者可以执行其他操作:
(quote *)
;;=> *
(symbol "*")
;;=> *
如果将符号转换为字符串,则会获取由该符号的名称(如果存在的话,还有名称空间)组成的字符串。如果将函数转换为字符串,则会获取对象的默认Java字符串表示形式:其类的名称,后跟该@
字符及其在内存中位置的十六进制表示形式:
(str '*)
;;=> "*"
(str *)
;;=> "clojure.core$_STAR_@a2a3e7"
因此,如果您Question
使用函数 *
作为其创建一个,operator
然后尝试将该函数转换为字符串,则会得到以下信息:
(str (->Question [4 2] *))
;;=> "4 clojure.core$_STAR_@a2a3e7 2 "
另一方面,如果您创建一个Question
以符号 *
为的符号operator
,则会得到以下符号:
(str (->Question [4 2] '*))
;;=> "4 * 2 "
给定一个符号,您可以使用将其解析为var resolve
,然后使用以下方法获取该var的值deref
:
@(resolve '*)
;;=> #function[clojure.core/*]
但是,通常不能采用其他方式(从函数到符号)。有关更多详细信息,请参见此问题的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句