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

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)))) ; 验证修改结果

补充说明

  1. 实例创建:部分Common Lisp实现支持直接用类名作为构造函数(如(b)),但(make-instance 'b)是标准写法,能适配更多实现。
  2. 槽绑定逻辑:当给槽指定:initform时,实例创建过程中会自动执行该表达式,将结果绑定到槽上,确保槽处于可访问的绑定状态,后续就能正常用oref读取和修改槽值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:42:05