4

我想我只是使用setq(或者setf,我不太确定有什么区别),但我不明白如何[i][j]在 lisp 的数组中引用 -th 元素。

我的开始条件是这样的:

? (setq x (make-array '(3 3)))
#2A((0 0 0) (0 0 0) (0 0 0))

我想改变,比如说,第三“行”的第二项来给出这个:

? ;;; What Lisp code goes here?!
#2A((0 0 0) (0 0 0) (0 "blue" 0))

以下,我认为接近,给出了一个错误:

(setq (nth 1 (nth 2 x)) "blue")

那么正确的语法是什么?

谢谢!

4

3 回答 3

15

我认为正确的方法是这样setf使用aref

(setf (aref x 2 1) "blue")

有关详细信息,请参阅参考

于 2013-08-05T15:50:42.223 回答
7

您可以ARRAY在 Common Lisp HyperSpec(ANSI Common Lisp 标准的网络版本:

http://www.lispworks.com/documentation/lw50/CLHS/Body/c_arrays.htm

AREF(SETF AREF)记录在这里:

http://www.lispworks.com/documentation/lw50/CLHS/Body/f_aref.htm

设置数组元素的语法是:(setf (aref array &rest subscripts) new-element).

基本上如果你想在 Common Lisp 中设置一些东西,你只需要知道如何获取它:

(aref my-array 4 5 2)  ; access the contents of an array at 4,5,2.

那么集合操作示意性地如下:

(setf <accessor code> new-content)

这意味着:

(setf (aref my-array 4 5 2) 'foobar)   ; set the content of the array at 4,5,2 to
                                       ; the symbol FOOBAR
于 2013-08-05T17:34:55.603 回答
3

正确的调用是

(setf (aref x 2 1) "blue")

setq分配给变量时使用。只setf知道如何“触及”复合对象,就像在数组中设置值一样。当然,setf也知道如何分配给变量,所以如果你坚持下去,setf你总是没问题的。

于 2013-08-05T16:05:12.593 回答