合并符号在Common Lisp中保持大小写

问题描述 投票:0回答:1

在我的代码中,符号必须区分大小写:

(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 |。请帮助。

lisp common-lisp symbols
1个回答
0
投票

您正在犯一些错误,例如:

> (setf (readtable-case *readtable*) :invert)
> (symbol-name (symbol-append 'K 'm))
"kM"

当符号的大小写与您键入的内容相反时,尝试使它执行正确的操作(无论正确的是什么,我真的不知道),您将有一个非常激动人心的时刻。您可以使symbol-append检查可读取的大小写,并欺骗字符的大小写,但这几乎肯定会在错误的时间发生。

您很可能想做的是区分您尝试编写的语言(符号区分大小写)和用于实现它的CL代码。然后为您尝试编写的语言编写一些阅读器,就像将*readtable*绑定到区分大小写的语言一样简单(不使用:invert,不使用:preserve)。然后,您阅读的符号将具有您所期望的情况。

© www.soinside.com 2019 - 2024. All rights reserved.