You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:18:27