Next: , Previous: Sequences Arrays Vectors, Up: Sequences Arrays Vectors


6.1 シーケンス

Emacs Lispでは、シーケンス(sequence)とはリストか配列のことです。 すべてのシーケンスに共通する性質は、 要素の順序付けた集まりであるということです。 本節では任意のシーケンスを受け付ける関数を説明します。

— Function: sequencep object

objectが、リスト、ベクトル、あるいは、文字列ならばtを返し、 さもなければnilを返す。

— Function: length sequence

この関数はsequence内の要素の個数を返す。 sequenceが(最後のcdrnilではないため) リストではないコンスセルであると、 エラー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
— Function: elt sequence index

この関数は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)を汎用にしたものである。

— Function: copy-sequence sequence

sequenceのコピーを返す。 コピーは、もとのシーケンスと同じ型のオブジェクトであり、 同じ要素が同じ順序で入っている。

コピーに新たな要素を格納しても、もとのsequenceには影響せず、 その逆もそうである。 しかし、新たなシーケンスの要素はコピーしていない。 つまり、それらはもとの要素と同一(eq)である。 したがって、シーケンスのコピーにおいて、 それらの要素の内部を変更すると、もとのシーケンスでもその変更がわかる。

シーケンスがテキスト属性を持つ文字列である場合には、 コピーの中の属性リストそのものもコピーであり、 もとの属性リストを共有するのではない。 しかし、属性の実際の値は共有される。

シーケンスをコピーする別の方法については、 Building ListsappendCreating StringsconcatVectorsvconcatを参照。

          (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)]