[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4 ペアとリスト

ペアとリストはSchemeにおける最も基本的なデータ構造のひとつです。 Gaucheのコアは全ての標準のリスト手続きと、多くのScheme実装に見られる 便利な手続きのいくつかを提供します。それらで足りない場合は さらに多くの手続きがsrfi-1 - List libraryutil.list - その他のリストライブラリutil.combinations - 組み合わせ といったモジュールで提供されています。 また、リストに限らないジェネリックなシーケンス/コレクションの操作が gauche.collection - コレクションフレームワークgauche.sequence - シーケンスフレームワークで提供されています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4.1 pairクラスとnullクラス

Builtin Class: <list>

リストを表す抽象クラスで、クラス<null>とクラス<pair>の親クラスです。 クラス<sequence>を継承します。

循環リストやドットリストも<list>クラスのインスタンスですが、 list?は偽の値を返すことに注意して下さい。

 
(use srfi-1)
(list? (circular-list 1 2)) ⇒ #f
(is-a? (circular-list 1 2) <list>) ⇒ #t
Builtin Class: <null>

空リストのクラスです。()がこのクラスの唯一のインスタンスです。

Builtin Class: <pair>

ペアのクラスです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4.2 リストの述語

Function: pair? obj

[R5RS] objがペアなら#tを、そうでなければ#fを返します。

Function: null? obj

[R5RS] objが空リストなら#tを、そうでなければ#fを返します。

Function: list? obj

[R5RS] objが正しいリストなら#tを、そうでなければ#fを返します。 この手続きはobjがドットリストや循環リストなら#fを返します。

SRFI-1(リストの述語)には更に、 proper-list?circular-list?dotted-list? といった手続きが定義されています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4.3 リストの構築子

Function: cons obj1 obj2

[R5RS] obj1obj2のペアを作成します。

 
(cons 'a 'b) ⇒ (a . b)
Function: acons obj1 obj2 obj3

(cons (cons obj1 obj2) obj3) を返します。 連想リストの先頭に新しいエントリを加えるのに便利です。

 
(acons 'a 'b '((c . d))) ⇒ ((a . b) (c . d))
Function: make-list len &optional fill

[SRFI-1] 長さlenの正規のリストを返します。引数fillが与えられていれば、各要素は fillになります。そうでなければ各要素の値は不定です。

 
(make-list 5 #t) ⇒ (#t #t #t #t #t)
Function: list obj …

[R5RS] 要素がobj …であるリストを作成します。

 
(list 1 2 3) ⇒ (1 2 3)
(list) ⇒ ()
Function: list* obj1 obj2 …

listとほぼ同じですが、最後の引数が作成されるリストの最後のペアのcdrになります。 SRFI-1ではこの手続きがcons*という名で定義されています。

 
(list* 1 2 3) ⇒ (1 2 . 3)
(list* 1) ⇒ 1
Function: list-copy list

[SRFI-1] listの浅いコピーを行います。 listが循環リストの場合、この手続きは停止しません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4.4 リストへのアクセスと変更

Function: car pair
Function: cdr pair

[R5RS] それぞれpairのcarとcdrを返します。

Function: set-car! pair obj
Function: set-cdr! pair obj

[R5RS] pairのcarもしくはcdrをobjで置き換えます。

注: (setter car)set-car! であり、 (setter cdr)set-cdr! です。

Function: caar pair
Function: cadr pair

Function: cdddar pair
Function: cddddr pair

[R5RS] caar(car (car x)), cadr(car (cdr x)), 等々。

対応するsetterも定義されています。

 
(let ((x (list 1 2 3 4 5)))
  (set! (caddr x) -1)
  x)
  ⇒ (1 2 -1 4 5)
Function: length list

[R5RS] 正規のリストlistの長さを返します。 listがドットリストならばエラーが起きます。 listが循環リストの場合、この関数は無限ループします。

循環リストも取り扱う場合は、SRFI-1のlength+を使って下さい (種々のリスト処理ルーチン参照)。

Function: list-tail list k &optional fallback

[R5RS] listk番目のcdrを返します。listは 正規のリストでもドットリストでも循環リストでも構いません。 (listがドットリストの場合、最後のcdrは無視されます)。

kの値が負であったりlistの長さ以上の場合、 fallback引数が与えられていればそれが返され、 そうでなければエラーが報告されます。

Function: list-ref list k &optional fallback

[R5RS+] listk番目の要素を返します。listは 正規のリストでもドットリストでも循環リストでも構いません。

もしkがリストの長さを超えていたり、負数であった場合は通常はエラーが起こります。 しかし、オプショナルな引数fallbackが与えられていた場合は、エラーは起きず fallbackが返されます。これはGaucheの拡張です。

Function: last-pair list

[SRFI-1] listの最後のペアを返します。listは 正規のリストかドットリストです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4.5 他のリスト手続き

Function: append list …

[R5RS] 渡されたリストの要素を繋げたリストを返します。最後の引数の部分以外は新しいセルがアロケート されて使われます。最後の引数は正規のリストである必要がありません。その場合、結果は正規でない リストとなります。

Function: append! list …

[SRFI-1] 渡されたリストの要素を繋げたリストを返します。最後の引数以外のリストのセルは、結果を 作成するために再利用されるかもしれません。 最後の引数は正規のリストである必要はありません。

Function: reverse list

[R5RS] listの各要素を逆順に持つリストを新しく作成して返します。

Function: reverse! list

[SRFI-1] listの各要素を逆順に持つリストを返します。結果を作成するために、 listのセルは再利用されるかもしれません。

Function: memq obj list
Function: memv obj list
Function: member obj list

[R5RS] listからobjを探します。もしlistn番目の要素が objと同一ならば、(list-tail list n)を返します。 memqは同一性の判定にeq?を、memveqv?を、 memberequal?を使います。 objlist中に見つからなければ#fが返されます。

SRFI-1 (srfi-1 - List library) を使うと、memberは オプショナルな同一性判定手続きを取るように拡張されます。

 
(memq 'a '(a b c))          ⇒ (a b c)
(memq 'b '(a b c))          ⇒  (b c)
(memq 'a '(b c d))          ⇒ #f
(memq (list 'a) '(b (a) c)) ⇒ #f
(memv 101 '(100 101 102))   ⇒ (101 102)
Function: assq obj list
Function: assv obj list
Function: assoc obj list

[R5RS] listの各要素はペアでなければなりません。 これらの手続きは、listの要素であるペアのうち、そのcarが objと一致するペアを左から探して行きます。もし見付かればそのペアが、 見付からなければ#fが返されます。 assqは比較関数にeq?を、assveqv?を、 assocequal?をそれぞれ用います。

SRFI-1 (srfi-1 - List library) を使うと、assocは オプショナルな同一性判定手続きを取るように拡張されます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.