Lisp-vectors

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

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)

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