关于"defun"中的"setf"?

z_a*_*xis 8 common-lisp

其实,我不完全理解的使用SETFdefun定义:

(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))
Run Code Online (Sandbox Code Playgroud)

我想它重新定义了''cookies-out*函数,不是吗?如果是这样,那么#'cookies-out*将是一个多态函数.

祝商祺!

小智 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 $ 20 between $ 20defsetf $ 20defun $ 20setf/comp.lang .lisp/5x3fjzMQ6Q0/_y8Q-P-SVPQJ

我个人的经验是,编写自己的SETF扩展器的需求很少,因为我以"功能"的方式编写了越来越多的代码.也就是说,当进入复杂的结构进行修改时,它通常被证明是一种非常方便的技术......至少在我了解功能性镜片是否是可行/理想的替代方案之前.