在Common Lisp中定义setf扩展器



事情是这样的:我不"了解"setf扩展器,我想了解它们是如何工作的。

我需要学习它们是如何工作的,因为我遇到了一个问题,这似乎是为什么你应该学习setf扩展器的典型例子,问题如下:

(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扩展器?

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

在Common Lisp中,函数名不仅可以是一个符号,还可以是以SETF为第一个符号的两个符号的列表。请参见上文。因此CCD_ 2可以定义CCD_。函数的名称为(setf arr-index)

setf函数可以在位置形式中使用:CLHS:作为位置的其他复合形式。

新值是第一个参数。

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)
Rainer的回答很准确。在ANSI Common Lisp之前,有必要使用defsetf为可以通过简单函数调用设置的简单位置定义一个扩展器。像(setf arr-index)这样的setf函数与CLOS一起出现在语言中,简化了很多事情。特别地,setf函数可以是通用的。

最新更新