常见的lisp如何在二维数组中设置一个元素?

时间:2013-08-05 15:32:08

标签: multidimensional-array common-lisp

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

我的开始条件是:

? (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")

那么正确的语法是什么?

谢谢!

3 个答案:

答案 0 :(得分:14)

我认为正确的方法是将setfaref一起使用,如下所示:

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

有关详细信息,请参阅reference

答案 1 :(得分:7)

您可以在Common Lisp HyperSpec中找到ARRAY操作的字典(ANSI Common Lisp标准的Web版本:

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

答案 2 :(得分:3)

正确的调用是

(setf (aref x 2 1) "blue")
在分配变量时使用

setq。只有setf知道如何“进入”复合对象,就像在数组中设置值一样。当然,setf也知道如何分配变量,所以如果你坚持setf,你总是可以的。