在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-namein(setf customer-name)和'customer-namein 是指同一个东西吗?该部分指出
第二个元素是一个符号,通常是用于访问 SETF 函数将设置的位置的函数的名称
如果是这种情况,那么
slot-value当函数可用于访问该位置时,为什么还要在函数定义中使用该函数?