使用Common Lisp开发时,我们可以定义三种新的setf
形式:
我们可以定义一个函数,其名称为两个符号的列表,第一个为setf
,例如(defun (setf some-observable) (…))
。
我们可以使用defsetf
的缩写形式。
我们可以使用defsetf
的长格式。
我们可以使用define-setf-expander
。
我不确定每种可能性的正确或预期用例是什么。
对此问题的回答可能暗示最通用的解决方案,并概述其他解决方案优越的环境。
答案 0 :(得分:5)
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扩展器中,可以一次遍历