我的程序创建伪数据。这些伪数据的一部分是符号形式的键:(lambda (i) (
make-symbol
(format nil
"~@r"
i)))
(以罗马数字为符号的fixnum值作为键) 。该程序将这些虚拟键值对存储在我正在开发的数据结构中。
我试图使用REPL中的这些符号来测试通过其键检索值。但是:
(equal (make-symbol "IX") (make-symbol "IX"))
无
(equal (make-symbol "IX") 'IX))
无
是否可以在REPL中输入先前用make-symbol
创建的符号,以便两者均为equal
?
答案 0 :(得分:7)
就像@coredump所建议的那样,使用intern将这些符号添加到某个包中,如下所示:
CL-USER> (defpackage :my-symbols)
#<Package "MY-SYMBOLS">
CL-USER> (intern "IX" :my-symbols)
MY-SYMBOLS::IX
NIL
CL-USER> (intern "IX" :my-symbols)
MY-SYMBOLS::IX
:INTERNAL
CL-USER> (eql (intern "IX" :my-symbols)
(intern "IX" :my-symbols))
T
CL-USER>
答案 1 :(得分:4)
一个人可以使用string=
来按名称比较符号:
CL-USER 29 > (string= (make-symbol "IX") (make-symbol "IX"))
T
CL-USER 30 > (string= (make-symbol "IX") (make-symbol "Ix"))
NIL
string-equal
是不区分大小写的变体。