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

时间:2019-02-16 13:04:55

标签: common-lisp setf

使用Common Lisp开发时,我们可以定义三种新的setf形式:

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

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

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

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

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

对此问题的回答可能暗示最通用的解决方案,并概述其他解决方案优越的环境。

1 个答案:

答案 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扩展器中,可以一次遍历