【发布时间】:2021-04-22 19:11:27
【问题描述】:
我最近遇到了关于 Lisp 结构的令人困惑的二分法。
使用(defstruct) 创建结构时,我们通过关键字(:slotname)指定槽。但是在访问它时,我们使用本地符号 ('slotname)。
为什么?这对我来说毫无意义。
另外,这不是每次声明结构都会污染keyword包吗?
如果我尝试按关键字访问插槽,我会遇到以下令人困惑的错误:
当试图读取槽的值(槽值)时,槽 :BALANCE 是 对象 #S(ACCOUNT :BALANCE 1000 :CUSTOMER-NAME "John Doe") 丢失。
我不明白这条信息。它似乎在告诉我,我眼皮底下的东西并不存在。
我尝试过使用局部符号声明结构;还有未绑定的关键字 (#:balance),这些都不起作用。
【问题讨论】:
-
你需要拿出一个实际的例子。在标准的 Common Lisp 结构中,插槽不是通过插槽名称访问的,而是通过函数访问的。
-
(slot-value 'balance some-object) -
直到今天我才知道结构有隐式访问函数。我已经使用
(slot-value)几个月了。所以,我的问题很简单,为什么(slot-value :balance some-object)不起作用? -
在 Common Lisp 标准中明确未指定 SLOT-VALUE 是否完全适用于结构对象。您的示例也没有任何意义,因为函数 SLOT-VALUE 的参数是错误的。首先是一个对象,然后是插槽名称。
-
@SodAlmighty:这是一个风格问题。许多人将访问器用于公共接口,并将插槽名称用于我怀疑的内部接口。对于用
defstruct定义的东西,只有访问器,但您可以假设访问器非常快(例如,您不能在它们上定义方法)。
标签: oop syntax common-lisp