陣列

陣列 在 Common Lisp

6 個練習

關於 陣列

在 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)。
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 陣列

練習已鎖定

再解鎖 5 個練習,就能練習 陣列