Lisp-sequences

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

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)