首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于"defun“中的"setf”?

关于"defun“中的"setf”?
EN

Stack Overflow用户
提问于 2012-01-11 03:39:26
回答 1查看 3K关注 0票数 10

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

代码语言:javascript
复制
(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*将是一个多态函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-16 00:42:15

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

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

函数名:http://clhs.lisp.se/Body/m_defun.htm

  • Glossary: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。

定义-SETF-扩展器是使用DEFSETF的长形式是不够的,虽然我从来没有理由使用它。有关这方面的一些有用信息,请参阅此https://groups.google.com/forum/#!searchin/comp.lang.lisp/difference$20between$20defsetf$20defun$20setf/comp.lang.lisp/5x3fjzMQ6Q0/_y8Q-P-SVPQJ线程: comp.lang.lisp

我个人的经验是,我很少需要编写自己的SETF扩展程序,因为我用“函数”的方式编写了越来越多的代码。也就是说,当深入到复杂的结构进行修改时,它常常被证明是一种非常方便的技术--…。至少在我明白功能镜片是否是可行/可取的选择之前。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8813851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档