17

事情是这样的:我没有“得到” setf-expanders 并且想了解它们是如何工作的。

我需要了解它们是如何工作的,因为我遇到了一个问题,这似乎是你应该学习 setf-expanders 的典型示例,问题如下:

(defparameter some-array (make-array 10))

(defun arr-index (index-string)
  (aref some-array (parse-integer index-string))

(setf (arr-index "2") 7) ;; Error: undefined function (setf arr-index)

如何为 ARR-INDEX 编写合适的 setf-expander?

4

2 回答 2

23
(defun (setf arr-index) (new-value index-string)
  (setf (aref some-array (parse-integer index-string))
        new-value))

在 Common Lisp 中,函数名不仅可以是一个符号,还可以是一个以SETF第一个符号为首的两个符号的列表。往上看。DEFUN因此可以定义SETF函数。该函数的名称是(setf arr-index)

setf 函数可用于place形式:CLHS:其他复合形式为 places

新值是第一个参数。

CL-USER 15 > some-array
#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)

CL-USER 16 > (setf (arr-index "2") 7)
7

CL-USER 17 > some-array
#(NIL NIL 7 NIL NIL NIL NIL NIL NIL NIL)
于 2012-07-12T18:51:14.843 回答
6

雷纳的回答是正确的。在 ANSI Common Lisp 之前,有必要使用defsetf为可以通过简单函数调用设置的简单位置定义扩展器。setf像 CLOS 这样的功能(setf arr-index)进入语言并简化了很多事情。特别是,setf函数可以是通用的。

于 2014-06-11T13:15:30.537 回答