Common Lisp中如何忽略包判断符号是否相等?
忽略包前缀判断Lisp符号相等的方法
在普通场景下,Lisp的符号相等判断很直接:(eq 'sym 'sym)会返回t。但在自定义包的场景中,比如传入'sym给my-package:my-function时,当前包的sym和my-package::sym属于不同的符号对象,用eq判断会返回nil,导致不符合预期的结果。如果直接转字符串比较又会遇到大小写匹配的问题,这里提供两种可靠的解决方式:
不区分大小写的同名判断:使用
symbol-name提取符号的名字字符串,再配合string-equal做不区分大小写的比较。示例代码:(string-equal (symbol-name 'sym) (symbol-name 'my-package::sym))这个表达式会返回
t,因为它只对比符号的名字内容,完全忽略所属包的差异,同时自动处理大小写问题。严格区分大小写的同名判断:如果需要精确匹配大小写,把
string-equal换成string=即可:(string= (symbol-name 'sym) (symbol-name 'my-package::sym))
原理说明
Lisp中eq判断符号相等的本质是检查两个符号是否为同一个内存对象,而不同包下的同名符号是独立的对象,所以eq会返回nil。symbol-name函数的作用是提取符号的名字部分,这个值和符号所属的包无关,因此通过比较名字字符串就能实现“忽略包判断符号是否同名”的需求。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

