在Common Lisp中能否获取不自动转为大写的符号名称?
如何在Common Lisp中获取大小写敏感的符号名称?
好问题!这里的核心在于Common Lisp处理符号名称的默认行为,咱们一步步拆解:
为什么(symbol-name 'aAbB)返回"AABB"?
Common Lisp的**读取器(Reader)**默认会自动将符号中的小写字母转换为大写字母。也就是说,当你输入'aAbB时,Lisp读取器已经把这个符号标准化为名称是"AABB"的符号——原输入的大小写信息在读取阶段就已经丢失了,所以不存在所谓的OTHER_FUNCTION?能从这个符号里找回"aAbB",因为符号本身的名称就是大写的。
怎么实现大小写敏感的符号名称获取?
如果需要保留符号名称的大小写,你得在定义符号时告诉读取器不要转换大小写,有两种常用方式:
- 用竖线包裹符号:这是最便捷的方式,直接用
|把符号括起来,比如'|aAbB|。此时调用(symbol-name '|aAbB|)就会返回"aAbB",完全保留原大小写。 - 用反斜杠逐个转义:对需要保留小写的字母前加
\,比如'a\Ab\B,不过这种方式适合单个字符的场景,不如竖线高效。
实际代码示例
;; 普通符号:读取器自动转大写 (symbol-name 'aAbB) ; 输出 "AABB" ;; 转义后的符号:保留原始大小写 (symbol-name '|aAbB|) ; 输出 "aAbB"
总结
- 对于已经被读取器转成大写的符号,无法恢复输入时的大小写——因为那部分信息已经丢失。
- 要使用大小写敏感的符号名称,必须在创建符号时通过竖线或反斜杠转义的方式保留大小写。
内容的提问来源于stack exchange,提问作者christian wuensche




