Emacs Lispでは、シーケンス(sequence)とはリストか配列のことです。 すべてのシーケンスに共通する性質は、 要素の順序付けた集まりであるということです。 本節では任意のシーケンスを受け付ける関数を説明します。
この関数はsequence内の要素の個数を返す。 sequenceが(最後のcdrが
nil
ではないため) リストではないコンスセルであると、 エラーwrong-type-argument
を通知する。関連する関数
safe-length
については、see List Elements。(length '(1 2 3)) => 3 (length ()) => 0 (length "foobar") => 6 (length [1 2 3]) => 3 (length (make-bool-vector 5 nil)) => 5
この関数はindexで添字付けされるsequenceの要素を返す。 indexの正当な値は、0からsequenceの長さより1小さい範囲の 整数である。 sequenceがリストである場合には、 範囲外のindexに対しては
nil
を返す。 さもなければエラーargs-out-of-range
を引き起こす。(elt [1 2 3 4] 2) => 3 (elt '(1 2 3 4) 2) => 3 ;;string
を用いてelt
が返す文字を明確にする (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この関数は、
aref
(see Array Functions)やnth
(see List Elements)を汎用にしたものである。
sequenceのコピーを返す。 コピーは、もとのシーケンスと同じ型のオブジェクトであり、 同じ要素が同じ順序で入っている。
コピーに新たな要素を格納しても、もとのsequenceには影響せず、 その逆もそうである。 しかし、新たなシーケンスの要素はコピーしていない。 つまり、それらはもとの要素と同一(
eq
)である。 したがって、シーケンスのコピーにおいて、 それらの要素の内部を変更すると、もとのシーケンスでもその変更がわかる。シーケンスがテキスト属性を持つ文字列である場合には、 コピーの中の属性リストそのものもコピーであり、 もとの属性リストを共有するのではない。 しかし、属性の実際の値は共有される。
シーケンスをコピーする別の方法については、 Building Listsの
append
、Creating Stringsのconcat
、 Vectorsのvconcat
を参照。(setq bar '(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 ;; 1つのシーケンスの1つの要素を置き換える (aset x 0 'quux) x => [quux (1 2)] y => [foo (1 2)] ;; 共有された要素の内部を修正する (setcar (aref x 1) 69) x => [quux (69 2)] y => [foo (69 2)]