4

我不明白为什么setf不能使用从函数调用返回的数组引用。在下面的示例中,为什么最终调用失败?

(setf arr #1a(a b c))

(defun ret-aref (a i)
    (aref a i))

(eql (ret-aref arr 0) (aref arr 0))

;succeeds
(progn
    (setf (aref arr 0) 'foo)
    arr)

;fails
(progn
    (setf (ret-aref arr 0) 'bar)
    arr)
4

1 回答 1

9

运算符实际上是setf一个宏,它需要能够在编译时检查位置表单。它有关于 的特殊知识aref,但对你的ret-aref.

让你的函数为人所知的最简单方法setf是为它定义一个合适的setf-function 伴侣。例子:

(defun (setf ret-aref) (new-value array index) 
   (setf (aref array index) new-value))

现在,(setf (ret-aref arr 0) 'bar)应该可以了。

这个简单的例子隐藏了一个事实,即setf-expansion 实际上是一个非常棘手的话题。你可以在 CLHS中找到血淋淋的细节。

于 2012-12-19T19:39:11.340 回答