我不完全了解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*将是一个多态函数。

最佳答案

您的代码段未重新定义任何功能。它本质上是在“扩展” Common Lisp的赋值功能,这是该语言的出色功能之一。如果有人尝试(setf(cookies-out * ...)...),则您后面的代码段将用于执行该分配。

关于您问题的评论者已经提到了这些“setf扩展器”,对此进行详细说明,您可能会发现从CLHS中阅读以下内容很有用。请注意,您的示例使用(defun(setf ...)...)形式,因此前两个链接适用。

  • 防御:http://clhs.lisp.se/Body/m_defun.htm
  • 函数名称词汇表:http://clhs.lisp.se/Body/26_glo_f.htm#function_name
  • DEFSETF:http://clhs.lisp.se/Body/m_defset.htm
  • DEFINE-SETF-EXPANDER:http://clhs.lisp.se/Body/m_defi_3.htm

  • DEFUN允许您定义将为SETF运行的函数。

    DEFSETF允许您命名一个函数(以简写形式)来完成工作,或者定义一个宏(以长写形式),该宏将为SETF扩展,并且通常必须谨慎地为后者使用PROGN案件。

    DEFINE-SETF-EXPANDER用于DEFSETF的长格式不够用的地方,尽管我从来没有理由使用它。有关此命令的一些有用信息,请参见此comp.lang.lisp线程:https://groups.google.com/forum/#!searchin/comp.lang.lisp/difference $ 20介于$ 20defsetf $ 20defun $ 20setf/comp.lang.lisp/5x3fjzMQ6Q0/_y8Q-P-SVPQJ

    根据我的个人经验,鉴于我越来越多地以“功能”风格编写代码,因此很少需要编写自己的SETF扩展器。也就是说,当进入复杂的结构进行修改时,通常可以证明它是一种非常方便的技术……至少直到我了解功能性镜片是否是可行/理想的替代产品为止。

    关于common-lisp - 关于 "setf"中的 "defun"吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8813851/

    10-12 02:13