3

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

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

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

  • 我们可以使用 的长形式defsetf

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

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

对这个问题的回答可以暗示最通用的解决方案,并概述其他解决方案优于其他解决方案的上下文。

4

1 回答 1

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 扩展器中可以通过一次遍历完成。

于 2019-02-16T22:53:55.437 回答