事实上,我并不完全理解 defun 中 setf 的用法:
(defun cookies-out* (&optional (reply *reply*))
"Returns an alist of the outgoing cookies associated with the REPLY object REPLY."
(cookies-out reply))
(defun (setf cookies-out*) (new-value &optional (reply *reply*))
"Sets the alist of the outgoing cookies associated with the REPLY object REPLY."
(setf (cookies-out reply) new-value))
我想它重新定义了''cookies-out *函数,不是吗?如果是这样,那么#'cookies-out*
将是一个多态函数。
此致!
答案 0 :(得分:14)
您的代码段未重新定义任何功能。它实质上是“扩展”Common Lisp的赋值功能 - 这是该语言的一个很好的功能。如果有人试图(setf(cookies-out * ...)...),那么你的后一段代码将用于执行该任务。
关于你的问题的评论者已经提到了这些“setf扩展器”,并且要详细说明这一点,你可能会发现从CLHS阅读以下项目很有用。请注意,您的示例使用(defun(setf ...)...)表单,因此前两个链接适用。
DEFUN允许您定义将为SETF运行的功能。
DEFSETF允许您命名函数(以简短形式)来完成工作,或者定义一个宏(以长格式),它将被扩展为一个SETF,你通常必须小心使用PROGN来适应后一种情况。
DEFINE-SETF-EXPANDER用于DEFSETF的长形式不足的地方,尽管我从未有过使用它的原因。有关这方面的一些有用信息,请参阅此comp.lang.lisp线程:https://groups.google.com/forum/#!searchin/comp.lang.lisp/difference $ 20defsetf $ 20defun $ 20setf / comp.lang.lisp / 5x3fjzMQ6Q0 / _y8Q-P-SVPQJ
我个人的经验是,编写自己的SETF扩展器的需求很少,因为我以“功能”的方式编写了越来越多的代码。也就是说,当进入复杂的结构进行修改时,它通常被证明是一种非常方便的技术......至少在我了解功能性镜片是否是可行/理想的替代方案之前。