Common Lisp子类槽unbound-slot错误原因及绑定解决方法咨询
问题原因与解决方案
错误的核心是你在定义子类b的b-slot时,用了错误的初始化关键字:init-form——Common Lisp标准中,类槽的初始化选项是:initform(无中间连字符)。父类a的a-slot用了正确的:initform,所以槽会被自动初始化为nil并完成绑定;而b-slot因关键字错误,初始化逻辑未生效,导致槽处于未绑定状态,调用oref访问时就触发了unbound-slot错误。
修正后的代码
(defclass a () ((a-slot :initform nil :type list))) (defclass b (a) ((b-slot :initform nil :type list))) ; 将:init-form改为标准的:initform (let ((obj (make-instance 'b))) ; 建议用标准的make-instance创建实例,兼容性更好 (push 1 (oref obj a-slot)) (push 2 (oref obj b-slot)) (print (list (oref obj a-slot) (oref obj b-slot)))) ; 验证修改结果
补充说明
- 实例创建:部分Common Lisp实现支持直接用类名作为构造函数(如
(b)),但(make-instance 'b)是标准写法,能适配更多实现。 - 槽绑定逻辑:当给槽指定
:initform时,实例创建过程中会自动执行该表达式,将结果绑定到槽上,确保槽处于可访问的绑定状态,后续就能正常用oref读取和修改槽值。
内容的提问来源于stack exchange,提问作者rje
相关产品推荐
相关产品推荐

