在 Common Lisp 中,陣列和其他語言一樣,是一組透過整數索引來存取的元素。 元素的型別可以各不相同。 陣列可以是多維的(不只是單純的一維)。
你可以用make-array來建立陣列。
它有很多選項,但比較簡單的用法可以建立 N 維陣列,並把所有元素都初始化成同一個值,或是用另一個序列(例如串列)中的值來初始化整個陣列。
它的第一個引數是一個串列,列出每個維度的大小。
(make-array '(4) :initial-element 3) ; => #(3 3 3 3)
(make-array '(2 2) :initial-element 'x) ; => #2A((X X) (X X))
(make-array '(3 3 3)
:initial-contents '(((a b c) (d e f) (g h i))
((j k l) (m n o) (p q r))
((s t u) (v w x) (y z &))))
; => #3A(((A B C) (D E F) (G H I))
((J K L) (M N O) (P Q R))
((S T U) (V W X) (Y Z &)))
(請注意,N 維陣列印出時會帶上維度的數目。)
陣列也可以用它們印出時所用的相同格式來建立:
#(x y z) ; => #(X Y Z)
#2A((1 2) (3 4)) ; => #2A((1 2) (3 4))
要存取向量的元素,請使用aref,索引從 0 開始。
提供的索引數量必須和陣列的秩相符。
(aref #2A((1 2 3) (3 4 5)) 1 0) ; => 3
(aref #3A(((a b) (c d))
((e f) (g h))
((t u) (v w)))
2 0 1) ; => U
(aref #2A((1) (2)) 0) ; => ERROR (because not enough indexes provided)
此外,提供的索引也必須落在建立陣列時所給定維度的範圍內。
這可以用array-in-bounds-p來檢查:
(array-in-bounds-p #2A((1) (2)) 0 0) ; => T
(array-in-bounds-p #2A((1) (2)) 2 0) ; => NIL
也可以用row-major-aref來存取元素,它接受一個整數,用來指定元素在列優先順序中的位置。
(這個列優先索引可以用array-row-major-index從各維索引計算出來。)
(array-row-major-index #2A((1 2 3) (4 5 6)) 1 1 ) ; => 4
(row-major-aref #2A((1 2 3) (4 5 6)) 4) ; => 5
要判斷某個物件是不是陣列,可以用arrayp。
(arrayp #(1 2 3)) ; => T
(arrayp #2((1 2 3) (4 5 6))) ; => T
(arrayp (list 1 2 3)) ; => NIL
用下列函式可以取得陣列的各種資訊:
array-rank:取得陣列的維度數(也就是陣列的秩)。array-dimensions:取得一個串列,內容是陣列各維度的大小。array-dimension:取得其中一個維度的大小。array-total-size:取得陣列中元素的總數。(let ((array #3A(((0 1) (2 3) (4 5))
((6 7) (8 9) (A B))
((C D) (E F) (G H))
((I J) (K L) (M N)))))
(list (array-rank array)
(array-dimensions array)
(array-dimension array 1)
(array-total-size array))) ; => (3 (4 3 2) 2 24)
Common Lisp 標準定義了一些關於陣列大小上限的限制。 這些限制可以從幾個已定義的常數得知:
array-rank-limit:陣列維度數的上限(定義為不小於 8)。array-dimension-limit:任一維度大小的上限(定義為不小於 1024)。array-total-size-limit:任何陣列元素數量的上限(定義為不小於 1024)。