为什么类槽用关键字指定但用符号访问?

Sod*_*hty -1 oop syntax common-lisp

我最近遇到了关于 Lisp 结构的令人困惑的二分法。

使用 来创建结构时(defstruct),我们通过关键字 ( :slotname)指定插槽。但是在访问它时,我们使用局部符号 ( 'slotname)。

为什么?这对我来说毫无意义。

另外,keyword每次声明结构时,这不会污染包吗?

如果我尝试通过关键字访问插槽,则会出现令人困惑的错误,例如:

尝试读取槽的值(槽值)时,对象 #S(ACCOUNT :BALANCE 1000 :CUSTOMER-NAME "John Doe") 中缺少槽 :BALANCE。

我不明白这个消息。它似乎在告诉我,我眼皮底下的东西并不存在。

我曾尝试使用本地符号声明结构;并且还有未绑定的关键字 ( #:balance) 并且这些都不起作用。

Rai*_*wig 5

DEFSTRUCT 在语言标准中是这样设计的:

  • 插槽名称未公开
  • 没有指定的方法来获取结构类的插槽名称列表
  • 没有通过插槽名称访问插槽的指定方法
  • 因此在运行时可能没有插槽名称
  • 使用访问器函数优化对插槽的访问:静态结构布局、内联访问器函数、...

还明确:

  • .slot-names 下不允许重复string=。因此插槽foo::abar::a在同一结构类中是不允许的

  • 重新定义结构的效果是不确定的

结构的目标是提供快速的类似记录的对象,而无需昂贵的特性,如重新定义、多重继承等。

因此使用SLOT-VALUE访问结构槽是实现的扩展,而不是定义语言的一部分。SLOT-VALUECLOS 是在将 CLOS 添加到 Common Lisp 时引入的。一些实现提供了一种通过 访问结构槽的方法SLOT-VALUE。这还要求实现跟踪该结构的插槽名称。

SLOT-VALUE只是一个更新的 API 函数,来自 CLOS for CLOS。结构是一个较旧的特性,它已经在 CLtL1 一书定义的 Common Lisp 的第一个版本中定义。