在Practical Common Lisp第17 章 Object Reorientation: Classes section Accessor Functions中,我发现很难理解SETF
扩展的方式。
功能:
(defun (setf customer-name) (name account)
(setf (slot-value account 'customer-name) name))
bank-account
类定义:
(defclass bank-account ()
((customer-name
:initarg :customer-name
:initform (error "Must supply a customer name."))
(balance
:initarg :balance
:initform 0)
(account-number
:initform (incf *account-numbers*))
account-type))
我不明白的是:
在表达式
(setf (customer-name my-account) "Sally Sue")
中确实(customer-name my-account)
返回类的 SETFable 插槽值customer-name
,bank-account
然后SETF
用于将值设置为“Sally Sue”?实际上是
(setf (customer-name my-account) "Sally Sue")
在调用上面的函数吗?如上定义是
setf customer-name
一个函数?上面的函数
customer-name
in(setf customer-name)
和'customer-name
in 是指同一个东西吗?该部分指出
第二个元素是一个符号,通常是用于访问 SETF 函数将设置的位置的函数的名称
如果是这种情况,那么
slot-value
当函数可用于访问该位置时,为什么还要在函数定义中使用该函数?