Lisp-arrays

提供:Dev Guides
移動先:案内検索

LISP-配列

LISPでは、 make-array 関数を使用して、単一または複数次元の配列を定義できます。 配列は、任意のLISPオブジェクトを要素として保存できます。

すべての配列は、連続したメモリ位置で構成されています。 最下位アドレスは最初の要素に対応し、最上位アドレスは最後の要素に対応します。

ランク

配列の次元数は、ランクと呼ばれます。

LISPでは、配列要素は非負の整数インデックスのシーケンスによって指定されます。 シーケンスの長さは、配列のランクと等しくなければなりません。 インデックスはゼロから始まります。

たとえば、my-arrayという名前の10セルの配列を作成するには、次のように記述できます-

(setf my-array (make-array '(10)))

aref関数を使用すると、セルのコンテンツにアクセスできます。 配列の名前とインデックス値の2つの引数を取ります。

たとえば、10番目のセルのコンテンツにアクセスするには、次のように記述します-

(aref my-array 9)

例1

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

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

あなたがコードを実行すると、それは次の結果を返します-

#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
#(25 23 45 10 20 17 25 19 67 30)

例2

3行3列の配列を作成しましょう。

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

(setf x (make-array '(3 3)
   :initial-contents '((0 1 2 ) (3 4 5) (6 7 8)))
)
(write x)

あなたがコードを実行すると、それは次の結果を返します-

#2A((0 1 2) (3 4 5) (6 7 8))

実施例3

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

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

あなたがコードを実行すると、それは次の結果を返します-

(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関数の完全な構文

make-array関数は、他の多くの引数を取ります。 この関数の完全な構文を見てみましょう-

make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-pointer  :displaced-to :displaced-index-offset

_dimensions_引数を除き、他のすべての引数はキーワードです。 次の表に、引数の簡単な説明を示します。

Sr.No. Argument & Description
1
  • dimensions*

配列の次元を提供します。 これは、1次元配列の数であり、多次元配列のリストです。

2

:element-type

これは型指定子であり、デフォルト値はTです。 いかなるタイプ

3

:initial-element

初期要素の値。 すべての要素が特定の値に初期化された配列を作成します。

4

:initial-content

オブジェクトとしての初期コンテンツ。

5

:adjustable

基になるメモリのサイズを変更できるサイズ変更可能な(または調整可能な)ベクトルを作成するのに役立ちます。 引数は、配列が調整可能かどうかを示すブール値で、デフォルト値はNILです。

6

:fill-pointer

サイズ変更可能なベクターに実際に保存されている要素の数を追跡します。

7

:displaced-to

これは、指定された配列と内容を共有する、置き換えられた配列または共有配列の作成に役立ちます。 両方の配列の要素タイプは同じである必要があります。 :displaced-toオプションは、:initial-elementまたは:initial-contentsオプションと一緒に使用することはできません。 この引数のデフォルトはnilです。

8

:displaced-index-offset

作成された共有配列のインデックスオフセットを提供します。

実施例4

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

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

あなたがコードを実行すると、それは次の結果を返します-

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#(C 1 2 3)

変位した配列が二次元である場合-

(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 :displaced-index-offset 2))
(write myarray)
(terpri)
(write array2)

あなたがコードを実行すると、それは次の結果を返します-

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#2A((C 1) (2 3) (D E))

変位したインデックスオフセットを5に変更してみましょう-

(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 :displaced-index-offset 5))
(write myarray)
(terpri)
(write array2)

あなたがコードを実行すると、それは次の結果を返します-

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#2A((3 D) (E F) (4 5))

実施例5

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

;a one dimensional array with 5 elements,
;initail value 5
(write (make-array 5 :initial-element 5))
(terpri)

;two dimensional array, with initial element a
(write (make-array '(2 3) :initial-element 'a))
(terpri)

;an array of capacity 14, but fill pointer 5, is 5
(write(length (make-array 14 :fill-pointer 5)))
(terpri)

;however its length is 14
(write (array-dimensions (make-array 14 :fill-pointer 5)))
(terpri)

; a bit array with all initial elements set to 1
(write(make-array 10 :element-type 'bit :initial-element 1))
(terpri)

; a character array with all initial elements set to a
; is a string actually
(write(make-array 10 :element-type 'character :initial-element #\a))
(terpri)

; a two dimensional array with initial values a
(setq myarray (make-array '(2 2) :initial-element 'a :adjustable t))
(write myarray)
(terpri)

;readjusting the array
(adjust-array myarray '(1 3) :initial-element 'b)
(write myarray)

あなたがコードを実行すると、それは次の結果を返します-

#(5 5 5 5 5)
#2A((A A A) (A A A))
5
(14)
#*1111111111
"aaaaaaaaaa"
#2A((A A) (A A))
#2A((A A B))