Lisp-vectors
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)
ベクトルはシーケンスであり、すべてのシーケンス関数はベクトルに適用できます。 ベクトル関数については、シーケンスの章を参照してください。