Lisp-sequences
LISP-シーケンス
シーケンスは、LISPの抽象データ型です。 ベクターとリストは、このデータ型の2つの具体的なサブタイプです。 シーケンスデータタイプで定義されたすべての機能は、実際にはすべてのベクトルおよびリストタイプに適用されます。
このセクションでは、シーケンスで最も一般的に使用される関数について説明します。
シーケンス(ベクターやリストなど)を操作するさまざまな方法を開始する前に、使用可能なすべての関数のリストを見てみましょう。
シーケンスを作成する
関数make-sequenceを使用すると、任意のタイプのシーケンスを作成できます。 この関数の構文は次のとおりです-
make-sequence sqtype sqsize &key :initial-element
タイプ_sqtype_および長さ_sqsize._のシーケンスを作成します
オプションで、_:initial-element_引数を使用して値を指定することもできます。その場合、各要素はこの値に初期化されます。
たとえば、main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
(write (make-sequence '(vector float)
10
:initial-element 1.0))
あなたがコードを実行すると、それは次の結果を返します-
#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)
シーケンスの汎用関数
Sr.No. | Function & Description |
---|---|
1 |
elt 整数インデックスを介して個々の要素にアクセスできます。 |
2 |
length シーケンスの長さを返します。 |
3 |
subseq 特定のインデックスで始まり、特定の終了インデックスまたはシーケンスの終わりまで続くサブシーケンスを抽出することにより、サブシーケンスを返します。 |
4 |
copy-seq 引数と同じ要素を含むシーケンスを返します。 |
5 |
fill シーケンスの複数の要素を単一の値に設定するために使用されます。 |
6 |
replace 2つのシーケンスを取り、最初の引数シーケンスは、2番目の引数シーケンスから連続した要素をコピーすることにより破壊的に変更されます。 |
7 |
count アイテムとシーケンスを受け取り、アイテムがシーケンスに表示される回数を返します。 |
8 |
reverse 引数の同じ要素を逆順で含むシーケンスを返します。 |
9 |
nreverse シーケンスと同じ要素を含む同じシーケンスを逆順で返します。 |
10 |
concatenate 任意の数のシーケンスの連結を含む新しいシーケンスを作成します。 |
11 |
position アイテムとシーケンスを受け取り、シーケンス内のアイテムのインデックスまたはnilを返します。 |
12 |
find アイテムとシーケンスが必要です。 シーケンス内のアイテムを見つけて返し、見つからない場合はnilを返します。 |
13 |
sort シーケンスと2つの引数の述語を取り、シーケンスのソートされたバージョンを返します。 |
14 |
merge 2つのシーケンスと1つの述語を取り、述語に従って2つのシーケンスをマージして生成されたシーケンスを返します。 |
15 |
map n引数の関数とn個のシーケンスを受け取り、関数をシーケンスの後続の要素に適用した結果を含む新しいシーケンスを返します。 |
16 |
some 述語を引数として受け取り、引数シーケンスを反復処理し、述語によって返される最初の非NIL値を返すか、述語が満たされない場合はfalseを返します。 |
17 |
every 述語を引数として受け取り、引数シーケンスを反復処理し、述語が失敗するとすぐに終了し、falseを返します。 述語が常に満たされる場合、trueを返します。 |
18 |
notany 述語を引数として受け取り、引数シーケンスを反復処理し、述語が満たされるとすぐにfalseを返し、満たされない場合はtrueを返します。 |
19 |
notevery 述語を引数として受け取り、引数シーケンスを反復処理し、述語が失敗するとすぐにtrueを返し、述語が常に満たされる場合はfalseを返します。 |
20 |
reduce 単一のシーケンスにマッピングし、最初にシーケンスの最初の2つの要素に2引数関数を適用し、次に関数とシーケンスの後続の要素によって返される値に適用します。 |
21 |
search シーケンスを検索して、テストを満たす1つ以上の要素を見つけます。 |
22 |
remove アイテムとシーケンスを受け取り、アイテムのインスタンスが削除されたシーケンスを返します。 |
23 |
delete これもアイテムとシーケンスを取り、アイテムを除いて同じ要素を持つ引数シーケンスと同じ種類のシーケンスを返します。 |
24 |
substitute 新しいアイテム、既存のアイテム、およびシーケンスを受け取り、既存のアイテムのインスタンスが新しいアイテムに置き換えられたシーケンスを返します。 |
25 |
nsubstitute 新しいアイテム、既存のアイテム、およびシーケンスを受け取り、既存のアイテムのインスタンスが新しいアイテムに置き換えられた同じシーケンスを返します。 |
26 |
mismatch 2つのシーケンスを取り、不一致の要素の最初のペアのインデックスを返します。 |
標準シーケンス関数のキーワード引数
Argument | Meaning | Default Value |
---|---|---|
:test | It is a two-argument function used to compare item (or value extracted by :key function) to element. | EQL |
:key | One-argument function to extract key value from actual sequence element. NIL means use element as is. | NIL |
:start | Starting index (inclusive) of subsequence. | 0 |
:end | Ending index (exclusive) of subsequence. NIL indicates end of sequence. | NIL |
:from-end | If true, the sequence will be traversed in reverse order, from end to start. | NIL |
:count | Number indicating the number of elements to remove or substitute or NIL to indicate all (REMOVE and SUBSTITUTE only). | NIL |
シーケンスで動作するこれらの関数の引数として使用されるさまざまな関数とキーワードについて説明しました。 次のセクションでは、例を使用してこれらの関数を使用する方法を説明します。
長さと要素を見つける
*length* 関数はシーケンスの長さを返し、 *elt* 関数を使用すると、整数インデックスを使用して個々の要素にアクセスできます。
例
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
(setq x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))
あなたがコードを実行すると、それは次の結果を返します-
5
D
シーケンスの変更
一部のシーケンス関数を使用すると、シーケンスを繰り返し処理し、明示的なループを記述せずに特定の要素を検索、削除、カウント、またはフィルタリングするなどの操作を実行できます。
次の例はこれを示しています-
例1
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
(write (count 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (substitute 10 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (find 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (position 5 '(1 5 6 7 8 9 2 7 3 4 5)))
あなたがコードを実行すると、それは次の結果を返します-
2
(1 6 7 8 9 2 7 3 4)
(1 6 7 8 9 2 7 3 4)
(1 5 6 10 8 9 2 10 3 4 5)
7
1
例2
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
(write (delete-if #'oddp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5) :count 1 :from-end t))
(terpri)
(setq x (vector 'a 'b 'c 'd 'e 'f 'g))
(fill x 'p :start 1 :end 4)
(write x)
あなたがコードを実行すると、それは次の結果を返します-
(6 8 2 4)
(1 5 7 9 7 3 5)
(1 5 6 7 8 9 2 7 3 5)
#(A P P P E F G)
シーケンスのソートとマージ
ソート関数は、シーケンスと2つの引数の述語を取り、シーケンスのソートされたバージョンを返します。
例1
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'<))
(terpri)
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'>))
(terpri)
あなたがコードを実行すると、それは次の結果を返します-
(1 2 3 3 4 4 5 6 7 8 9)
(9 8 7 6 5 4 4 3 3 2 1)
例2
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
(write (merge 'vector #(1 3 5) #(2 4 6) #'<))
(terpri)
(write (merge 'list #(1 3 5) #(2 4 6) #'<))
(terpri)
あなたがコードを実行すると、それは次の結果を返します-
#(1 2 3 4 5 6)
(1 2 3 4 5 6)
シーケンス述語
関数every、some、notany、noteveryは、シーケンス述部と呼ばれます。
これらの関数はシーケンスを反復処理し、ブール述語をテストします。
これらの関数はすべて、最初の引数として述語を取り、残りの引数はシーケンスです。
例
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
(write (every #'evenp #(2 4 6 8 10)))
(terpri)
(write (some #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (every #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (notany #'evenp #(2 4 6 8 10)))
(terpri)
(write (notevery #'evenp #(2 4 6 8 10 13 14)))
(terpri)
あなたがコードを実行すると、それは次の結果を返します-
T
T
NIL
NIL
T
マッピングシーケンス
マッピング関数についてはすでに説明しました。 同様に、 map 関数を使用すると、1つ以上のシーケンスの後続の要素に関数を適用できます。
*map* 関数は、n引数の関数とn個のシーケンスを取り、シーケンスの後続の要素に関数を適用した後、新しいシーケンスを返します。
例
main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。
(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))
あなたがコードを実行すると、それは次の結果を返します-
#(6 15 16 40)