在使用 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/