我想我只是使用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")
那么正确的语法是什么?
谢谢!
答案 0 :(得分:14)
答案 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
,你总是可以的。