在我的代码中,符号必须区分大小写:
(eq 'p 'P)
nil
所以我添加了:
(setf (readtable-case *readtable*) :invert)
在文件的开头,效果很好。
但是我还必须在两个符号中制作一个符号(将它们合并)
(foo 'K 'm)
Km
“合并”两个符号,我发现以下功能(here):
(defun symbol-append (&rest symbols)
(intern (apply #'concatenate 'string
(mapcar #'symbol-name symbols))))
这是可行的,但不符合要求:
CL-USER> (symbol-append 'K 'm)
KM
如何在保持大小写的同时合并两个符号?
编辑
['| some-符号|但是我不得不退缩了吗
(setf (readtable-case *readtable*) :upcase)
所以现在在我的“数据库”中,| Km |或| PHz |很好。
现在的问题是程序的用户将要插入诸如'Km或'PHz之类的东西,我想将它们与数据库中的东西进行比较,但是:
(eq '|Km| 'Km)
nil
因为'Km被插入为KM和'| Km |为| Km |。请帮助。
您正在犯一些错误,例如:
> (setf (readtable-case *readtable*) :invert)
> (symbol-name (symbol-append 'K 'm))
"kM"
当符号的大小写与您键入的内容相反时,尝试使它执行正确的操作(无论正确的是什么,我真的不知道),您将有一个非常激动人心的时刻。您可以使symbol-append
检查可读取的大小写,并欺骗字符的大小写,但这几乎肯定会在错误的时间发生。
您很可能想做的是区分您尝试编写的语言(符号区分大小写)和用于实现它的CL代码。然后为您尝试编写的语言编写一些阅读器,就像将*readtable*
绑定到区分大小写的语言一样简单(不使用:invert
,不使用:preserve
)。然后,您阅读的符号将具有您所期望的情况。