LISP允許使用make-array函數(shù)來定義一個(gè)或多個(gè)維數(shù)組。一個(gè)數(shù)組可以任意LISP對象存儲(chǔ)為它的元素。
所有數(shù)組組成的連續(xù)的存儲(chǔ)單元。最低的地址對應(yīng)于第一個(gè)元素和最高地址的最后一個(gè)元素。
數(shù)組的維數(shù)被稱為它的秩。
在LISP語言中,數(shù)組元素是由一個(gè)非負(fù)整數(shù)索引的順序指定。該序列的長度必須等于數(shù)組的秩。索引從0開始。
例如,要?jiǎng)?chuàng)建一個(gè)數(shù)組,10 - 單元格,命名為my-array,我們可以這樣寫:
(setf my-array (make-array '(10)))
aref 函數(shù)允許訪問該單元格的內(nèi)容。它有兩個(gè)參數(shù),數(shù)組名和索引值。
例如,要訪問的第十單元格的內(nèi)容,可以這樣編寫:
(aref my-array 9)
示例1
創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:
(write (setf my-array (make-array '(10)))) (terpri) (setf (aref my-array 0) 25) (setf (aref my-array 1) 23) (setf (aref my-array 2) 45) (setf (aref my-array 3) 10) (setf (aref my-array 4) 20) (setf (aref my-array 5) 17) (setf (aref my-array 6) 25) (setf (aref my-array 7) 19) (setf (aref my-array 8) 67) (setf (aref my-array 9) 30) (write my-array)
當(dāng)執(zhí)行以上代碼,它返回以下結(jié)果:
#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL) #(25 23 45 10 20 17 25 19 67 30)
示例 2
讓我們創(chuàng)建一個(gè)3×3數(shù)組。
創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:
(setf x (make-array '(3 3) :initial-contents '((0 1 2 ) (3 4 5) (6 7 8)))) (write x)
當(dāng)執(zhí)行以上代碼,它返回以下結(jié)果:
#2A((0 1 2) (3 4 5) (6 7 8))
示例 3
創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:
(setq a (make-array '(4 3))) (dotimes (i 4) (dotimes (j 3) (setf (aref a i j) (list i 'x j '= (* i j))))) (dotimes (i 4) (dotimes (j 3) (print (aref a i j))))
當(dāng)執(zhí)行以上代碼,它返回以下結(jié)果:
(0 X 0 = 0) (0 X 1 = 0) (0 X 2 = 0) (1 X 0 = 0) (1 X 1 = 1) (1 X 2 = 2) (2 X 0 = 0) (2 X 1 = 2) (2 X 2 = 4) (3 X 0 = 0) (3 X 1 = 3) (3 X 2 = 6)
make-array函數(shù)完整的語法
make-array函數(shù)需要許多其他的參數(shù)。讓我們來看看這個(gè)函數(shù)的完整語法:
make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-yiibaier :displaced-to :displaced-index-offset
除了維度參數(shù),所有其他參數(shù)都是關(guān)鍵字。下表提供的參數(shù)簡要說明。
參數(shù) | 描述 |
---|---|
dimensions | 它給該數(shù)組的大小。它是一個(gè)數(shù)字為一維數(shù)組,而對于多維數(shù)組列表。 |
:element-type | 它是類型說明符,默認(rèn)值是T,即任何類型 |
:initial-element | 初始元素值。它將使一個(gè)數(shù)組的所有初始化為一個(gè)特定值的元素。 |
:initial-content | 初始內(nèi)容作為對象。 |
:adjustable | 它有助于創(chuàng)造一個(gè)可調(diào)整大小(或可調(diào))向量,其底層的內(nèi)存可以調(diào)整大小。該參數(shù)是一個(gè)布爾值,表示數(shù)組是否可調(diào)與否,默認(rèn)值是nil。 |
:fill-yiibaier | 它跟蹤實(shí)際存儲(chǔ)在一個(gè)可調(diào)整大小的矢量元素的數(shù)目 |
:displaced-to | 它有助于創(chuàng)造一個(gè)移位的數(shù)組或共享數(shù)組共享其內(nèi)容與指定的數(shù)組。這兩個(gè)數(shù)組應(yīng)該有相同的元素類型。位移到選項(xiàng)可能無法使用:displaced-to或:initial-contents選項(xiàng)。此參數(shù)默認(rèn)為nil。 |
:displaced-index-offset | 它給出了索引偏移創(chuàng)建的共享數(shù)組。 |
示例4
創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:
(setq myarray (make-array '(3 2 3) :initial-contents '(((a b c) (1 2 3)) ((d e f) (4 5 6)) ((g h i) (7 8 9)) ))) (setq array2 (make-array 4 :displaced-to myarray :displaced-index-offset 2)) (write myarray) (terpri) (write array2)
當(dāng)執(zhí)行以上代碼,它返回以下結(jié)果:
#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9))) #(C 1 2 3)
若對數(shù)組是二維的:
(setq myarray (make-array '(3 2 3) :initial-contents '(((a b c) (1 2 3)) ((d e f) (4 5 6)) ((g h i) (7 8 9)) ))) (setq array2 (make-array '(3 2) :displaced-to myarray