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

What are the typical use-cases of (defun (setf …)) defsetf and define-setf-expander

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

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

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

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

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

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

,使功能数据结构在本地表现得像一个可变结构。

为了性能,考虑 (incf (nth 10000 list)) 的愚蠢情况,如果 nth writer 作为函数实现,则需要遍历 10k 列表节点两次,但在 setf 扩展器中可以使用单遍历.