この節では、あらゆる種類のシーケンスを受け付ける関数について説明します。
この関数は、object がリスト、ベクトル、文字列、bool-vector、または char-table
の場合は t を、それ以外の場合は nil
を返します。以下の seqp も参照してください。
この関数は sequence の要素数を返します。引数がシーケンスでないかドット付きリストである場合は
wrong-type-argument エラーを、引数が循環リストである場合は circular-list エラーを発生させます。文字テーブルの場合、返される値は常に Emacs
の最大文字コードより 1 大きい値となります。
関連する関数 safe-length については、safe-length
の定義を参照してください。
(length '(1 2 3))
⇒ 3
(length ())
⇒ 0
(length "foobar")
⇒ 6
(length [1 2 3])
⇒ 3
(length (make-bool-vector 5 nil))
⇒ 5
テキスト表現のstring-bytesも参照してください。
表示上の文字列の幅を計算する必要がある場合は、length ではなく string-width を使用してください(表示テキストのサイズ を参照)。length は文字数のみをカウントし、各文字の表示幅を考慮しないためです。
sequence が length
より短い場合は、non-nil を返します。sequence が長いリストである場合、sequence
の長さを計算するよりも効率的かもしれません。
sequence が length
より長い場合は、nil 以外を返す。
sequenceの長さがlengthと等しい場合は、non-nilを返す。
この関数は、sequence の index
番目の要素を返します。index の有効な値は、0 から sequence の長さより 1 小さい値までの整数です。sequence がリストの場合、範囲外の値は nth
と同様に扱われます。第 n
要素の定義 を参照してください。それ以外の場合、範囲外の値は args-out-of-range エラーを発生させます。
(elt [1 2 3 4] 2)
⇒ 3
(elt '(1 2 3 4) 2)
⇒ 3
;; We use string to show clearly which character elt returns.
(string (elt "1234" 2))
⇒ "3"
(elt [1 2 3 4] 4)
error→ Args out of range: [1 2 3 4], 4
(elt [1 2 3 4] -1)
error→ Args out of range: [1 2 3 4], -1
この関数は、シーケンスまたはレコードであるseqrのコピーを返します。このコピーは元のオブジェクトと同じ型であり、同じ要素を同じ順序で保持しています。ただし、seqrが文字列や長さ0のベクトルのように空である場合、この関数が返す値はコピーではなく、同じ型でseqrと同一の空のオブジェクトとなる場合があります。
コピーに新しい要素を格納しても元の seqr
には影響せず、その逆も同様です。ただし、コピー内の要素はコピーではなく、元の要素と同一(eq)です。したがって、コピーを介して行われたこれらの要素内の変更は、元の要素でも確認できます。
引数がテキストプロパティを持つ文字列である場合、コピー内のプロパティリスト自体もコピーとなり、元のプロパティリストとは共有されません。ただし、プロパティの実際の値は共有されます。テキストプロパティを参照してください。
この関数はドット付きリストには対応していません。循環リストをコピーしようとすると、無限ループが発生する可能性があります。
シーケンスをコピーするその他の方法については、Building
Cons Cells and Lists の append、Creating Strings の concat、および Functions for Vectors の vconcat も参照してください。
(setq bar (list 1 2))
⇒ (1 2)
(setq x (vector 'foo bar))
⇒ [foo (1 2)]
(setq y (copy-sequence x))
⇒ [foo (1 2)]
(eq x y)
⇒ nil
(equal x y)
⇒ t
(eq (elt x 1) (elt y 1))
⇒ t
;; Replacing an element of one sequence.
(aset x 0 'quux)
x ⇒ [quux (1 2)]
y ⇒ [foo (1 2)]
;; Modifying the inside of a shared element.
(setcar (aref x 1) 69)
x ⇒ [quux (69 2)]
y ⇒ [foo (69 2)]
この関数は、sequence の要素を逆順に並べた新しいシーケンスを作成します。元の引数 sequence は変更されません。なお、文字テーブルを逆順にすることはできません。
(setq x '(1 2 3 4))
⇒ (1 2 3 4)
(reverse x)
⇒ (4 3 2 1)
x
⇒ (1 2 3 4)
(setq x [1 2 3 4])
⇒ [1 2 3 4]
(reverse x)
⇒ [4 3 2 1]
x
⇒ [1 2 3 4]
(setq x "xyzzy")
⇒ "xyzzy"
(reverse x)
⇒ "yzzyx"
x
⇒ "xyzzy"
この関数は sequence の要素の順序を反転させます。reverse とは異なり、元の sequence
が変更される場合があります。
例えば:
(setq x (list 'a 'b 'c))
⇒ (a b c)
x
⇒ (a b c)
(nreverse x)
⇒ (c b a)
;; The cons cell that was first is now last.
x
⇒ (a)
混乱を避けるため、通常は nreverse
の結果を、元のリストを保持していたのと同じ変数に格納します:
(setq x (nreverse x))
お気に入りの例である(a b c)のnreverseを、図示すると以下の通りです:
Original list head: Reversed list: ------------- ------------- ------------ | car | cdr | | car | cdr | | car | cdr | | a | nil |<-- | b | o |<-- | c | o | | | | | | | | | | | | | | ------------- | --------- | - | -------- | - | | | | ------------- ------------
ベクトルの場合はさらに簡単で、setqは不要です:
(setq x (copy-sequence [1 2 3 4]))
⇒ [1 2 3 4]
(nreverse x)
⇒ [4 3 2 1]
x
⇒ [4 3 2 1]
なお、reverseとは異なり、この関数は文字列には対応していません。asetを使用して文字列データを変更することは可能ですが、たとえ可変であっても、文字列を不変として扱うことが強く推奨されます。可変性を参照してください。
この関数は、リストまたはベクトルである必要がある sequence をソートし、同じ型のソート済みシーケンスを返します。ソートは安定しており、つまりソートキーが等しい要素は相対的な順序が維持されます。以下のオプションのキーワード引数を取ります:
:key keyfuncsequence から単一の要素を受け取り、そのキー値を返す関数 keyfunc を使用して、比較に用いるキーを生成します。この引数が省略されているか、あるいは keyfunc が nil である場合は、identity が想定されます。つまり、要素そのものがソートキーとして使用されます。
:lessp predicateキーの順序を指定するには predicate を使用します。predicate は2つのソートキーを引数として受け取り、1つ目が2つ目より前に来るべき場合に non-nil を返す関数です。この引数が省略されているか、あるいは predicate が nil である場合は value< が使用されます。これは多くの異なる Lisp
型に適用可能で、通常は昇順にソートします(後述の 値の定義< を参照してください)。
一貫性を保つため、あらゆる述語は以下の規則に従わなければならない:
:reverse flagflag が nil
以外の場合、ソート順が反転します。デフォルトの :lessp
述語では、これは降順でソートすることを意味します。
:in-place flagflag が nil でない場合、sequence はインプレースで(破壊的に)ソートされ、返されます。nil の場合、あるいはこの引数が指定されていない場合は、入力のソート済みコピーが返され、sequence 自体は変更されません。インプレースソートはわずかに高速ですが、元のシーケンスは失われます。
デフォルトの動作が要件に合わない場合は、別の :lessp 述語を用意するよりも、新しい :key 関数を定義する方が通常は簡単で迅速です。例えば、以下の文字列をソートする場合を考えてみましょう:
(setq numbers '("one" "two" "three" "four" "five" "six"))
(sort numbers)
⇒ ("five" "four" "one" "six" "three" "two")
代わりに別のキー関数を指定することで、文字列を長さ順にソートできます:
(sort numbers :key #'length)
⇒ ("one" "two" "six" "four" "five" "three")
ソートの安定性により、同じ長さの文字列が元の順序を維持している点に注目してください。次に、長さでソートしつつ、同長の場合は文字列の内容で判定したいとします。最も簡単な方法は、要素をこの方式でソート可能な値に変換するキー関数を指定することです。value<
は複合オブジェクト(cons、リスト、ベクトル、レコード)を辞書順にソートするため、次のように記述できます:
(sort numbers :key (lambda (x) (cons (length x) x)))
⇒ ("one" "six" "two" "five" "four" "three")
(3 . "six") が (3
. "two") より前に配置される、といった具合だからです。
以前のバージョンのEmacsとの互換性のため、sort関数は固定の2引数形式でも呼び出すことができます:
(sort sequence predicate)
ここで predicate は引数 :lessp
です。この形式を使用する場合、ソートは常にインプレースで行われます。
ソートを行うその他の関数については、テキストのソートを参照してください。sortの有用な例については、ドキュメント文字列へのアクセスのdocumentationを参照してください。
この関数は、標準のソート順で a が b より前に来る場合に
non-nil を返します。つまり、b が a より前に来る場合、あるいは両者が等しいか順序が不定である場合には、nil を返します。
引数 a と b は同じ型である必要があります。具体的には:
< を使用します(< の定義を参照)。
string-lessp を用いて比較され(string-lessp
の定義 を参照)、シンボルは名前を文字列として比較することで比較されます。
value<
の値となります。一方のシーケンスがもう一方より先に要素を使い切った場合、短い方のシーケンスが長い方よりも前に来ます。
nil
のもの)は、いかなるライブバッファよりも優先して比較されます。
nil となります。
例:
(value< -4 3.5) ⇒ t (value< "dog" "cat") ⇒ nil (value< 'yip 'yip) ⇒ nil (value< '(3 2) '(3 2 0)) ⇒ t (value< [3 2 "a"] [3 2 "b"]) ⇒ t
なお、nil は、比較対象に応じて、シンボルまたは空リストのいずれかとして扱われます:
(value< nil '(0)) ⇒ t (value< 'nib nil) ⇒ t
比較可能なシーケンス(リスト、ベクトルなど)の長さに制限はありませんが、循環構造や深くネストされたデータ構造の比較に value< を使用すると、エラーが発生することがあります。
seq.el ライブラリでは、seq-
を接頭辞とする以下の追加のシーケンス操作マクロおよび関数が提供されています。
本ライブラリで定義されているすべての関数は副作用を持ちません。すなわち、引数として渡されたいかなるシーケンス(リスト、ベクトル、または文字列)も変更しません。特に断りのない限り、結果は入力と同じ型のシーケンスとなります。述語を引数に取る関数については、その述語は単一引数の関数である必要があります。
seq.el
ライブラリは、追加の種類の逐次データ構造にも対応できるよう拡張可能です。そのために、すべての関数は cl-defgeneric を用いて定義されています。拡張機能を追加するための cl-defgeneric の使用に関する詳細については、ジェネリック関数 を参照してください。
This function returns the element of sequence at the
specified index, which is an integer whose valid
value range is zero to one less than the length of sequence. For out-of-range values on built-in sequence
types, seq-elt behaves like elt. For the details, see Definition of elt.
(seq-elt [1 2 3 4] 2) ⇒ 3
seq-elt は、setf
を用いて設定可能なプレースホルダーを返します(setf
マクロを参照)。
(setq vec [1 2 3 4]) (setf (seq-elt vec 2) 5) vec ⇒ [1 2 5 4]
この関数は sequence の要素数を返します。組み込みのシーケンス型では、seq-length は length
と同様に動作します。長さの定義 を参照してください。
この関数は、object がシーケンス(リストまたは配列)である場合、あるいは seq.el ジェネリック関数で定義されたその他の種類のシーケンスである場合に、non-nil を返します。これは sequencep
の拡張可能なバリアントです。
(seqp [1 2]) ⇒ t
(seqp 2) ⇒ nil
この関数は、sequence の最初の n(整数)個を除くすべての要素を返します。n が負または 0 の場合、結果は sequence となります。
(seq-drop [1 2 3 4 5 6] 3) ⇒ [4 5 6]
(seq-drop "hello world" -4) ⇒ "hello world"
この関数は、sequence の先頭 n
個(整数)の要素を返します。n が負または 0 の場合、結果は nil となります。
(seq-take '(1 2 3 4) 3) ⇒ (1 2 3)
(seq-take [1 2 3 4] 0) ⇒ []
この関数は sequence の要素を順に返し、predicate が nil
を返す最初の要素の手前で処理を終了します。
(seq-take-while (lambda (elt) (> elt 0)) '(1 2 3 -1 -2)) ⇒ (1 2 3)
(seq-take-while (lambda (elt) (> elt 0)) [-1 4 6]) ⇒ []
この関数は、predicate が nil
を返す最初の要素から順に、sequence の要素を返します。
(seq-drop-while (lambda (elt) (> elt 0)) '(1 2 3 -1 -2)) ⇒ (-1 -2)
(seq-drop-while (lambda (elt) (< elt 0)) [1 4 6]) ⇒ [1 4 6]
この関数は、長さが(最大)lengthであるsequenceの部分列からなるリストを返します。(sequenceの長さがlengthの倍数でない場合、最後の要素はlengthより短くなることがあります。)
(seq-split [0 1 2 3 4] 2) ⇒ ([0 1] [2 3] [4])
この関数は、sequence の各要素に対して順に function を適用し(おそらく副作用のため)、sequence を返します。
この関数は、sequence の各要素に function を適用した結果を返します。返される値はリストです。
(seq-map #'1+ '(2 4 6)) ⇒ (3 5 7)
(seq-map #'symbol-name [foo bar])
⇒ ("foo" "bar")
この関数は、seq 内の sequence の各要素とそのインデックスに function を適用した結果を返します。返される値はリストです。
(seq-map-indexed (lambda (elt idx)
(list idx elt))
'(a b c))
⇒ ((0 a) (1 b) (2 c))
この関数は、sequences の各要素に function を適用した結果を返します。function のアリティ(subr-arity を参照)は、シーケンスの数と一致している必要があります。マッピングは最も短いシーケンスの末尾で終了し、返される値はリストとなります。
(seq-mapn #'+ '(2 4 6) '(20 40 60)) ⇒ (22 44 66)
(seq-mapn #'concat '("moskito" "bite") ["bee" "sting"])
⇒ ("moskitobee" "bitesting")
この関数は、predicate が nil 以外を返す
sequence 内のすべての要素のリストを返します。
(seq-filter (lambda (elt) (> elt 0)) [1 -1 3 -3 5]) ⇒ (1 3 5)
(seq-filter (lambda (elt) (> elt 0)) '(-1 -3 -5)) ⇒ nil
この関数は、predicate が nil を返す
sequence 内のすべての要素のリストを返します。
(seq-remove (lambda (elt) (> elt 0)) [1 -1 3 -3 5]) ⇒ (-1 -3)
(seq-remove (lambda (elt) (< elt 0)) '(-1 -3 -5)) ⇒ nil
この関数は、(0始まりの)インデックス n の要素が削除された sequence のコピーを返します。結果は sequence と同じ型のシーケンスとなります。
(seq-remove-at-position [1 -1 3 -3 5] 0) ⇒ [-1 3 -3 5]
(seq-remove-at-position [1 -1 3 -3 5] 3) ⇒ [1 -1 3 5]
この関数は、sequence の要素に対して function を呼び出した際に得られた、nil
以外のすべての結果のリストを返します。
(seq-keep #'cl-digit-char-p '(?6 ?a ?7)) ⇒ (6 7)
この関数は、function を initial-value と sequence の第1要素で呼び出し、その結果を function に渡し、さらにその結果と sequence の第2要素で呼び出し、続いてその結果と sequence の第3要素で呼び出す、といった処理の結果を返します。function は2つの引数を取る関数である必要があります。
function は2つの引数で呼び出されます。initial-value(およびその後の累積値)が第1引数として使用され、sequence の要素が第2引数として使用されます。
sequence が空の場合、function を呼び出さずに initial-value を返します。
(seq-reduce #'+ [1 2 3 4] 0) ⇒ 10
(seq-reduce #'+ '(1 2 3 4) 5) ⇒ 15
(seq-reduce #'+ '() 3) ⇒ 3
この関数は、sequence の各要素に順に predicate を適用して得られる値のうち、最初の nil
以外の値を返します。
(seq-some #'numberp ["abc" 1 nil]) ⇒ t
(seq-some #'numberp ["abc" "def"]) ⇒ nil
(seq-some #'null ["abc" 1 nil]) ⇒ t
(seq-some #'1+ [2 4 6]) ⇒ 3
この関数は、sequence の要素のうち、predicate が nil
以外を返す最初の要素を返します。predicate に一致する要素がない場合は、default を返します。
なお、見つかった要素が default と同一である場合、この関数には曖昧さが生じます。そのようなケースでは、要素が見つかったのか否かを判断できないためです。
(seq-find #'numberp ["abc" 1 nil]) ⇒ 1
(seq-find #'numberp ["abc" "def"]) ⇒ nil
この関数は、sequenceのすべての要素にpredicateを適用した結果がnilでない場合に、nil以外を返します。
(seq-every-p #'numberp [2 4 6]) ⇒ t
(seq-every-p #'numberp [2 4 "6"]) ⇒ nil
この関数は、sequence が空の場合に non-nil を返します。
(seq-empty-p "not empty") ⇒ nil
(seq-empty-p "") ⇒ t
この関数は、predicate が nil 以外を返す
sequence の要素数を返します。
(seq-count (lambda (elt) (> elt 0)) [-1 2 0 3 -2]) ⇒ 2
This function returns a copy of sequence that is
sorted according to function, a function of two
arguments that returns non-nil if the first
argument should sort before the second.
この関数は seq-sort に似ていますが、sequence の要素はソートされる前に function
を適用して変換されます。function は1つの引数を取る関数です。
(seq-sort-by #'seq-length #'> ["a" "ab" "abc"]) ⇒ ["abc" "ab" "a"]
この関数は、sequence の要素のうち少なくとも1つが elt と等しい場合に non-nil
を返します。オプション引数 function が non-nil である場合、それはデフォルトの equal
の代わりに使用する2つの引数を取る関数となります。
(seq-contains-p '(symbol1 symbol2) 'symbol1) ⇒ t
(seq-contains-p '(symbol1 symbol2) 'symbol3) ⇒ nil
この関数は、sequence1 と sequence2
に順序に関わらず同じ要素が含まれているかどうかを判定します。オプション引数 testfn が nil 以外である場合、デフォルトの equal
の代わりに使用する2つの引数を取る関数となります。
(seq-set-equal-p '(a b c) '(c b a)) ⇒ t
(seq-set-equal-p '(a b c) '(c b)) ⇒ nil
(seq-set-equal-p '("a" "b" "c") '("c" "b" "a"))
⇒ t
(seq-set-equal-p '("a" "b" "c") '("c" "b" "a") #'eq)
⇒ nil
この関数は、sequence の中で elt
と等しい最初の要素の(0始まりの)インデックスを返します。オプション引数 function が nil 以外である場合、それはデフォルトの equal
の代わりに使用する2引数関数となります。
(seq-position '(a b c) 'b) ⇒ 1
(seq-position '(a b c) 'd) ⇒ nil
この関数は、testfn にその要素と elt
を引数として渡した際に nil 以外の値が返される sequence 内の要素の(0始まりの)インデックスのリストを返します。testfn のデフォルト値は equal です。
(seq-positions '(a b c a d) 'a) ⇒ (0 3)
(seq-positions '(a b c a d) 'z) ⇒ nil
(seq-positions '(11 5 7 12 9 15) 10 #'>=) ⇒ (0 3 5)
この関数は、sequence の要素から重複を取り除いたリストを返します。オプション引数 function が nil 以外の場合、これはデフォルトの
equal の代わりに使用する2引数関数となります。
(seq-uniq '(1 2 2 1 3)) ⇒ (1 2 3)
(seq-uniq '(1 2 2.0 1.0) #'=) ⇒ (1 2)
この関数は、startからendまでのsequenceの部分集合を返します。どちらも整数です(endはデフォルトで最後の要素となります)。startまたはendが負の場合、sequenceの末尾からカウントします。
(seq-subseq '(1 2 3 4 5) 1) ⇒ (2 3 4 5)
(seq-subseq '[1 2 3 4 5] 1 3) ⇒ [2 3]
(seq-subseq '[1 2 3 4 5] -3 -1) ⇒ [3 4]
この関数は、sequences を連結して構成される型 type のシーケンスを返します。type には、vector、list、または string が指定可能です。
(seq-concatenate 'list '(1 2) '(3 4) [5 6]) ⇒ (1 2 3 4 5 6)
(seq-concatenate 'string "Hello " "world") ⇒ "Hello world"
この関数は、sequence の各要素に function
を適用した結果に対して、seq-concatenate を適用した結果を返します。結果は型 type のシーケンス、または type が nil の場合はリストとなります。
(seq-mapcat #'seq-reverse '((3 2 1) (6 5 4))) ⇒ (1 2 3 4 5 6)
この関数は、sequence の要素を長さ n
の部分列にグループ化したリストを返します。最後の部分列に含まれる要素数は、n
より少なくなる場合があります。n は整数である必要があります。n が負の整数または 0 の場合、戻り値は nil となります。
(seq-partition '(0 1 2 3 4 5 6 7) 3) ⇒ ((0 1 2) (3 4 5) (6 7))
この関数は、sequence1 または sequence2
のいずれかに現れる要素のリストを返します。返されるリストの要素はすべて一意であり、すなわち、どの2つの要素も等しいとはみなされません。オプション引数
function が nil
以外である場合、デフォルトの equal
の代わりに、要素の比較に使用する2つの引数を取る関数を指定する必要があります。
(seq-union [1 2 3] [3 5]) ⇒ (1 2 3 5)
この関数は、sequence2 に含まれない要素を除去した sequence1 のコピーを返します。オプション引数 function が nil 以外の場合、これはデフォルトの
equal の代わりに要素の比較に使用する2引数関数となります。
(seq-intersection [2 3 4 5] [1 3 5 6 7]) ⇒ (3 5)
この関数は、sequence2 に含まれる要素を除去した sequence1 のコピーを返します。オプション引数 function が nil 以外の場合、これはデフォルトの
equal の代わりに要素の比較に使用する2引数関数となります。
(seq-difference '(2 3 4 5) [1 3 5 6 7]) ⇒ (2 4)
この関数は、sequence の要素を、sequence
の各要素に function を適用した結果をキーとするアリストに分割します。キーの比較には equal が用いられます。
(seq-group-by #'integerp '(1 2.1 3 2 3.2)) ⇒ ((t 1 3 2) (nil 2.1 3.2))
(seq-group-by #'car '((a 1) (b 2) (a 3) (c 4))) ⇒ ((b (b 2)) (a (a 1) (a 3)) (c (c 4)))
この関数は、シーケンス sequence を型 type
のシーケンスに変換します。type には、vector、string、または list のいずれかの記号を指定できます。
(seq-into [1 2 3] 'list) ⇒ (1 2 3)
(seq-into nil 'vector) ⇒ []
(seq-into "hello" 'vector) ⇒ [104 101 108 108 111]
この関数は、sequence の最小要素を返します。sequence の要素は、数値またはマーカー(マーカーを参照)である必要があります。
(seq-min [3 1 2]) ⇒ 1
(seq-min "Hello") ⇒ 72
この関数は sequence の最大要素を返します。sequence の要素は数値またはマーカーである必要があります。
(seq-max [1 3 2]) ⇒ 3
(seq-max "Hello") ⇒ 111
このマクロは dolist(dolist を参照)に似ていますが、sequence
にはリスト、ベクトル、または文字列を指定できる点が異なります。これは主に副作用を利用する際に有用です。
このマクロは、var-sequence で定義された変数を、val-sequence の対応する要素の値にバインドします。これは 構造分解バインディング と呼ばれます。var-sequence の要素自体にシーケンスを含めることができるため、入れ子構造の構造分解が可能です。
var-sequence シーケンスには、&rest マーカーに続き、val-sequence
の残りの部分にバインドされる変数名を含めることもできます。
(seq-let [first second] [1 2 3 4] (list first second)) ⇒ (1 2)
(seq-let (_ a _ b) '(1 2 3 4) (list a b)) ⇒ (2 4)
(seq-let [a [b [c]]] [1 [2 [3]]] (list a b c)) ⇒ (1 2 3)
(seq-let [a b &rest others] [1 2 3 4] others)
⇒ [3 4]
pcase パターンは、束縛の構造分解を行うための代替手段を提供します。詳細は pcase パターンによる構造分解 を参照してください。
このマクロはseq-letと同様に動作しますが、値がletのバインドのようにではなく、あたかもsetqであるかのように変数に代入される点が異なります。
(let ((a nil)
(b nil))
(seq-setq (_ a _ b) '(1 2 3 4))
(list a b))
⇒ (2 4)
この関数は、sequence の要素をランダムに返します。
(seq-random-elt [1 2 3 4]) ⇒ 3 (seq-random-elt [1 2 3 4]) ⇒ 2 (seq-random-elt [1 2 3 4]) ⇒ 4 (seq-random-elt [1 2 3 4]) ⇒ 2 (seq-random-elt [1 2 3 4]) ⇒ 1
sequence が空の場合、この関数はエラーを通知します。