LISP-ベクター

ベクトルは1次元配列であるため、配列のサブタイプです。ベクトルとリストはまとめてシーケンスと呼ばれます。したがって、これまでに説明したすべてのシーケンスジェネリック関数と配列関数はベクトルで機能します。

ベクトルの作成

ベクトル関数を使用すると、特定の値を持つ固定サイズのベクトルを作成できます。任意の数の引数を取り、それらの引数を含むベクトルを返します。

例1

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

(setf v1 (vector 1 2 3 4 5))
(setf v2 #(a b c d e))
(setf v3 (vector 'p 'q 'r 's 't))

(write v1)
(terpri)
(write v2)
(terpri)
(write v3)

コードを実行すると、次の結果が返されます-

#(1 2 3 4 5)
#(A B C D E)
#(P Q R S T)

LISPはベクトルのリテラル表記として#(...)構文を使用することに注意してください。この#(...)構文を使用して、リテラルベクトルを作成し、コードに含めることができます。

ただし、これらはリテラルベクトルであるため、それらの変更はLISPでは定義されていません。したがって、プログラミングには、常にvector 関数、またはより一般的な関数 make-array 変更する予定のベクトルを作成します。

ザ・ make-array関数は、ベクトルを作成するためのより一般的な方法です。を使用してベクトル要素にアクセスできますaref 関数。

例2

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

(setq a (make-array 5 :initial-element 0))
(setq b (make-array 5 :initial-element 2))

(dotimes (i 5)
   (setf (aref a i) i))
   
(write a)
(terpri)
(write b)
(terpri)

コードを実行すると、次の結果が返されます-

#(0 1 2 3 4)
#(2 2 2 2 2)

塗りつぶしポインタ

ザ・ make-array 関数を使用すると、サイズ変更可能なベクトルを作成できます。

ザ・ fill-pointer関数の引数は、ベクトルに実際に格納されている要素の数を追跡します。これは、ベクトルに要素を追加するときに埋められる次の位置のインデックスです。

ザ・ vector-push関数を使用すると、サイズ変更可能なベクトルの末尾に要素を追加できます。フィルポインタが1増加します。

ザ・ vector-pop 関数は最後にプッシュされたアイテムを返し、塗りつぶしポインタを1つ減らします。

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

(setq a (make-array 5 :fill-pointer 0))
(write a)

(vector-push 'a a)
(vector-push 'b a)
(vector-push 'c a)

(terpri)
(write a)
(terpri)

(vector-push 'd a)
(vector-push 'e a)

;this will not be entered as the vector limit is 5
(vector-push 'f a)

(write a)
(terpri)

(vector-pop a)
(vector-pop a)
(vector-pop a)

(write a)

コードを実行すると、次の結果が返されます-

#()
#(A B C)
#(A B C D E)
#(A B)

ベクトルはシーケンスであり、すべてのシーケンス関数はベクトルに適用できます。ベクトル関数については、シーケンスの章を参照してください。