(defun (setf …)) defsetf 和 define-setf-expander 的典型用例是什么
What are the typical use-cases of (defun (setf …)) defsetf and define-setf-expander
在使用 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
writer 作为函数实现,则需要遍历 10k 列表节点两次,但在 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
writer 作为函数实现,则需要遍历 10k 列表节点两次,但在 setf 扩展器中可以使用单遍历.