Common lisp 关于「;setf";在;“defun”是什么;?

Common lisp 关于「;setf";在;“defun”是什么;?,common-lisp,Common Lisp,我不完全理解setf在defun中的用法: 我想它重新定义了函数#'cookies-out*,不是吗?如果是这样,那么cookies-out*将是一个多态函数。您的代码片段没有重新定义任何函数。它本质上是在“扩展”CommonLisp的赋值功能,这是该语言的一个很好的特性。如果有人试图(setf(cookies out*…)),那么后面的代码片段将用于执行该赋值 关于您的问题的评论员已经提到了这些“setf扩展器”,为了详细说明这一点,您可能会发现阅读CLHS中的以下项目很有用。请注意,您的示例

我不完全理解setf在defun中的用法:


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

您的代码片段没有重新定义任何函数。它本质上是在“扩展”CommonLisp的赋值功能,这是该语言的一个很好的特性。如果有人试图(setf(cookies out*…)),那么后面的代码片段将用于执行该赋值

关于您的问题的评论员已经提到了这些“setf扩展器”,为了详细说明这一点,您可能会发现阅读CLHS中的以下项目很有用。请注意,您的示例使用(defun(setf…)表单,因此前两个链接适用

  • 德芬:
  • 函数名术语表:
  • DEFSETF:
  • DEFINE-SETF-EXPANDER:
DEFUN允许您定义将为SETF运行的函数

DEFSETF允许您命名一个函数(以简短的形式)来执行该任务,或者定义一个宏(以长形式),该宏将为SETF展开,并且对于后一种情况,您通常必须小心使用PROGN

DEFINE-SETF-EXPANDER用于DEFSETF的长格式不够的地方,尽管我从来没有理由使用它。请参阅这个comp.lang.lisp线程,以获取一些有用的信息:$20defsetf$20defun$20setf/comp.lang.lisp/5x3fjzMQ6Q0//u y8Q-P-SVPQJ

鉴于我越来越多地以“函数式”风格编写代码,我个人的经验是,很少需要编写自己的SETF扩展器。也就是说,当接触复杂结构进行修改时,它通常被证明是一种非常方便的技术……至少在我了解功能性镜片是否是一种可行/可取的替代品之前。

搜索“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))