配列

配列 の Common Lisp

6個の演習

配列について

Common Lispでは、他の言語と同じように、配列は整数のインデックスでアクセスする要素の集まりです。 要素の型は異なっていてもかまいません。 配列は多次元にできます(単に1次元だけではありません)。

作成

make-arrayを使うと配列を作成できます。 多くのオプションがありますが、より単純な形では、すべての要素を1つの値で初期化した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でもアクセスできます。これは、行優先順序で要素を指定する1つの整数を取ります。 (行優先インデックスは、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:次元のうち1つのサイズを取得します。
  • 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:1つの次元の最大サイズ(1024以上と定義されています)。
  • array-total-size-limit:任意の配列の要素の最大数(1024以上と定義されています)。
GitHubで編集 リンクは新しいウィンドウまたはタブで開きます

配列を学習する

練習はロックされています

配列を練習するには、あと5個の演習のロックを解除してください