如何重新创建由make-symbol创建的符号

时间:2018-09-19 15:31:37

标签: common-lisp

我的程序创建伪数据。这些伪数据的一部分是符号形式的键:(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

2 个答案:

答案 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是不区分大小写的变体。