2013-08-05 23 views
4

我想我只是用setq(或setf,我真的不知道的差異),但我不明白如何引用[i][j]個元素在口齒不清的數組。common lisp如何在2d數組中設置元素?

我的啓動條件是:

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

那麼,什麼是正確的語法?

謝謝!

+2

你的問題沒有真正的一部分,但你可能會發現([集,setq和SETF之間的區別] http://stackoverflow.com/questions/869529/differe nce-between-set-setq-and-setf-in-common-lisp)有趣。 – Sylwester

+0

*很有趣,謝謝! +1,因爲這是一個問題內的問題。 :) – Olie

回答

13

我認爲正確的方法是使用setfaref這樣的:

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

欲瞭解更多詳情,請參見reference

+4

請注意,Common Lisp中的數組在概念上實際上是多維的,而不僅僅是數組的數組。這就是爲什麼有一個「aref」操作,而不是嵌套操作。 – Svante

+0

請注意,鏈接引用(Common Lisp the Language,第2版,通常稱爲CLtL2)已經過時了。 Common Lisp在其他答案中對HyperSpec的引用更具權威性。 –

+1

@ joshua-taylor我修正了它 – MAnyKey

3

正確的調用是當你賦值給一個變量

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

setq使用。只有setf知道如何「觸及」複合對象,就像在數組中設置一個值一樣。當然,setf也知道如何分配變量,所以如果你堅持setf,你將永遠沒事。

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