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

Common Lisp中get-setf-method替换为get-setf-expansion的适配问题

《On Lisp》sortf宏的两个常见问题解析

关于macroexpand-1输出中重复的#:NEW1符号

原《On Lisp》第12章的sortf宏依赖get-setf-method实现,但新版SBCL默认已禁用该函数,有人将其替换为get-setf-expansion后,用macroexpand-1查看展开结果时,会看到多个#:NEW1符号,看起来像是重复定义的问题,但实际多数场景下sortf都能正常工作。

这是因为这些#:NEW1是不同的未内部化符号——它们的名字字符串相同,但本身是独立的符号实例。如果想直观区分它们,只需设置cl:*print-circle*为t,此时Lisp打印器会给重复出现的符号加上循环标记(比如#1#、#2#),就能明确看到它们是完全不同的对象。

关于修改字面量列表时的异常

当用sortf修改像'(25 30 35)这类字面量列表时,会出现异常结果。这是Lisp的基础陷阱:通过quote创建的字面量属于常量对象,Lisp标准明确规定修改常量的行为是未定义的,不同编译器的表现差异很大——有的会直接抛出只读错误,有的会产生不可预期的结果,甚至可能影响到其他引用该常量的代码。

内容的提问来源于stack exchange,提问作者dhnam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 03:07:05