Sod*_*hty -1 oop syntax common-lisp
我最近遇到了关于 Lisp 结构的令人困惑的二分法。
使用 来创建结构时(defstruct),我们通过关键字 ( :slotname)指定插槽。但是在访问它时,我们使用局部符号 ( 'slotname)。
为什么?这对我来说毫无意义。
另外,keyword每次声明结构时,这不会污染包吗?
如果我尝试通过关键字访问插槽,则会出现令人困惑的错误,例如:
尝试读取槽的值(槽值)时,对象 #S(ACCOUNT :BALANCE 1000 :CUSTOMER-NAME "John Doe") 中缺少槽 :BALANCE。
我不明白这个消息。它似乎在告诉我,我眼皮底下的东西并不存在。
我曾尝试使用本地符号声明结构;并且还有未绑定的关键字 ( #:balance) 并且这些都不起作用。
DEFSTRUCT 在语言标准中是这样设计的:
还明确:
.slot-names 下不允许重复string=。因此插槽foo::a和bar::a在同一结构类中是不允许的
重新定义结构的效果是不确定的
结构的目标是提供快速的类似记录的对象,而无需昂贵的特性,如重新定义、多重继承等。
因此使用SLOT-VALUE访问结构槽是实现的扩展,而不是定义语言的一部分。SLOT-VALUECLOS 是在将 CLOS 添加到 Common Lisp 时引入的。一些实现提供了一种通过 访问结构槽的方法SLOT-VALUE。这还要求实现跟踪该结构的插槽名称。
SLOT-VALUE只是一个更新的 API 函数,来自 CLOS for CLOS。结构是一个较旧的特性,它已经在 CLtL1 一书定义的 Common Lisp 的第一个版本中定义。