common-lisp - (defun (setf …)) defsetf 和 define-setf-expander 的典型用例是什么

标签 common-lisp setf

在使用 Common Lisp 进行开发时,我们可以通过三种方式来定义新的 setf 形式:

  • 我们可以定义一个函数,其名称是两个符号的列表,第一个是 setf,例如(defun (setf some-observable) (…))

  • 我们可以使用defsetf的缩写形式。

  • 我们可以使用defsetf的长格式。

  • 我们可以使用define-setf-expander

我不确定每种可能性的正确或预期用例是什么。

对这个问题的回答可能会暗示最通用的解决方案,并概述其他解决方案更优越的上下文。

最佳答案

define-setf-expander 是其中最通用的。 setf 的所有功能都包含在其中。

定义一个 setf 函数对大多数访问器来说都很好。使用通用函数也是有效的,因此多态性不足以要求使用其他东西。控制正确性或性能评估是使用 setf 函数的主要原因。

为了正确性,许多形式的解构不可能用 setf 函数来处理(例如 (setf (values ...) ...))。类似地,我看到了一个示例,该示例通过更改 (setf (dict-get key some-dict) 2) 将新字典分配给 some 使功能数据结构在本地表现得像一个可变结构-dict.

为了性能,请考虑 (incf (nth 10000 list)) 的愚蠢情况,如果将 nth 编写器实现为函数,则需要遍历 10k 列表节点两次, 但在 setf 扩展器中可以通过一次遍历完成。

关于common-lisp - (defun (setf …)) defsetf 和 define-setf-expander 的典型用例是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54723353/

相关文章:

common-lisp - 使用 Quicklisp 安装后使用迭代

python - 普通口齿不清 : Launch subprocess with different working directory than lisp process

syntax-error - Lisp,指令在 defun 中不起作用

common-lisp - 当我在 LISP 中使用普通的 setf 语句时会发生什么?

variables - 通过使用 SETF 定义变量来避免错误

tree - Setf(?)导致树中的循环

c++ - 防止在C++中显示小数点前的零

syntax - Common Lisp 未定义调度字符

lisp - 读取时评估宏与准引用