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

10.2 srfi-1 - List library

Module: srfi-1

SRFI-1 は、リスト操作ライブラリの豊富なコレクションです (SRFI-1)。 このライブラリを使うには、(use srfi-1) として下さい。 Olin Shivers氏のリファレンス実装に基づいて実装されています。


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

10.2.1 リストの構築子

Function: xcons cd ca

[SRFI-1] (cons ca cd) と同等です。高階手続きへ渡すのに便利です。

Function: cons* elt1 elt2 …

[SRFI-1] list と似ていますが、最後の引数が構築されたリストの 末尾になります。Gauche の組み込み手続き list* と同意です。

 
(cons* 1 2 3 4) ⇒ (1 2 3 . 4)
(cons* 1) ⇒ 1
Function: list-tabulate n init-proc

[SRFI-1] n個の要素をもつリストを構築し、それぞれの要素を (init-proc i) で生成します。

 
(list-tabulate 4 values) ⇒ (0 1 2 3)
Function: circular-list elt1 elt2 …

[SRFI-1] 指定した要素をもつ循環リストを構築します。

 
(circular-list 'z 'q) ⇒ (z q z q z q …)
Function: iota count &optional (start 0) (step 1)

[SRFI-1] startから始まり、stepずつ増加する、 count 個の要素からなる数値のリストを返します。

 
(iota 5) ⇒ (0 1 2 3 4)
(iota 5 0 -0.1) ⇒ (0 -0.1 -0.2 -0.3 -0.4)

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

10.2.2 リストの述語

Function: proper-list? x

[SRFI-1] x が真性リストであれば #t を返します。

Function: circular-list? x

[SRFI-1] x が循環リストであれば #t を返します。

Function: dotted-list? x

[SRFI-1] x が有限の大きさで、空リストで終端していないリストなら #t を返します。これには、ペアではなく、空リストもない値(たとえば シンボルや数値)のような長さ0のドットリストと考えられるものを含みます。

Function: null-list? list

[SRFI-1] list が空リスト () なら #t を返します。 それ以外のときは #f を返します。

Function: not-pair? x

[SRFI-1] (lambda (x) (not (pair? x)))と同じです。

SRFI-1 では、「真性リストおよびドットリストの両方で、すべての有限リストを 扱う手続き用の終端条件として便利なように用意した」とあります。

Function: list= elt= list …

[SRFI-1] elt= を用いて、n番目の要素をそれぞれ比較することで、 与えられたリストの同値性を決定します。

list= を真性リスト以外に適用するとエラーになります。

同値性判定の手続きは eq? と整合性がなければなりません。すなわち

 
(eq? x y) ⇒ (elt= x y).

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

10.2.3 リスト選択子

Function: first pair
Function: second pair
Function: third pair
Function: fourth pair
Function: fifth pair
Function: sixth pair
Function: seventh pair
Function: eighth pair
Function: ninth pair
Function: tenth pair

[SRFI-1] リスト(非真性でも可)のn番目の要素を返します。

Function: car+cdr pair

[SRFI-1] (car pair) および (cdr pair) の二つの値を返します。

Function: take x i
Function: drop x i

[SRFI-1] take はリスト x の最初のi個の要素を返します。 drop はリスト x の最初のi個の要素を除いたリストを返します。

 
(take '(a b c d e)  2) => (a b)
(drop '(a b c d e)  2) => (c d e)

x はあらゆる値をとりえます。

 
(take '(1 2 3 . d) 2) => (1 2)
(drop '(1 2 3 . d) 2) => (3 . d)
(drop '(1 2 3 . d) 3) => d

dropxi 回 cdr 操作をおこなうのと全く 同じです。返される値は、x と共通の末尾を共有します。一方、 take は、引数のリストが長さ0でないリストなら必ず新しいリストの 領域を確保します。

i がリスト x の終端を超えたらエラーが発生します。 より寛容なバージョンの takedrop については、 See section util.list - その他のリストライブラリ を参照してください。

あらゆる並びからの部分並びを抽出する汎用的な方法に関しては、 シーケンスのスライス にある subseq を参照してください。

Function: take-right flist i
Function: drop-right flist i

[SRFI-1] take-rightflist の最後の i個の要素 からなるリストを返します。 drop-rightflist の最後の i個の要素を 除いたリスト返します。

 
(take-right '(a b c d e) 2) => (d e)
(drop-right '(a b c d e) 2) => (a b c)

flist は有限リストであればOKです。

 
(take-right '(1 2 3 . d) 2) => (2 3 . d)
(drop-right '(1 2 3 . d) 2) => (1)
(take-right '(1 2 3 . d) 0) => d
(drop-right '(1 2 3 . d) 0) => (1 2 3)

take-right の返す値はいつでも first の共通の末尾を共有します。 drop-right は、引数が長さが0でないリストなら、必ず新しいリストの 領域を確保します。

i がリスト flist の長さより大きければエラーが発生します。 より寛容なバージョンの take-rightdrop-right については、 See section util.list - その他のリストライブラリ を参照してください。

Function: take! x i
Function: drop-right! x i

[SRFI-1] take および drop-right の その場で更新されるバージョンです。これらの 手続きは x を破壊的に変更するかもしれません。

x が循環リストなら、take! は期待されるものより短いリストを返す 可能性があります。

Function: split-at x i
Function: split-at! x i

[SRFI-1] split-at はリスト x をインデックス i の 位置で分割し、最初の i 個の要素からなるリストと、残りの末尾とを 返します。

 
(split-at '(a b c d e) 2) ⇒ (a b) (c d e)

split-at! はその場で更新されるバージョンです。 これは x を破壊的に更新するかもしれません。

Function: last pair

[SRFI-1] 空ではない有限リスト pair の最後の要素を返します。 これは、(car (last-pair pair)) と同等です。

註: last-pair は Gauche の組み込み手続きです。


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

10.2.4 種々のリスト処理ルーチン

Function: length+ x

[SRFI-1] x が真性リストなら、その長さを返します。さもなければ、 #f を返します。

Function: concatenate list-of-lists
Function: concatenate! list-of-lists!

[SRFI-1] それぞれ、(apply append list-of-lists) および (apply append! list-of-lists) と同等です。

Function: append-reverse rev-head tail
Function: append-reverse! rev-head tail

[SRFI-1] append-reverse(append (reverse rev-head) tail) を 返します。append-reverse! はその場で更新されるバージョンです。

Function: zip clist1 clist2 …

[SRFI-1] (map list clist1 clist2 …) と同等です。 n 本のリストが zip に渡された場合には、そのなかで一番短いものと 同じ長さのリストを返します。返されたリストは、要素が n 要素のリストで、 そのそれぞれが、引数として渡ってリストの対応する要素になっています。

 
(zip '(one two three) 
     '(1 2 3)
     '(odd even odd even odd even odd even))
     ⇒ ((one 1 odd) (two 2 even) (three 3 odd))

(zip '(1 2 3)) ⇒ ((1) (2) (3))

引数のリストのうち、少くともひとつは有限のリストでなければなりません。

 
(zip '(3 1 4 1) (circular-list #f #t)) 
     ⇒ ((3 #f) (1 #t) (4 #f) (1 #t))
Function: unzip1 list
Function: unzip2 list
Function: unzip3 list
Function: unzip4 list
Function: unzip5 list

[SRFI-1] unzip1 はリストのリストを引数としてとります。それぞれの リストは少くとも一つの要素を含むものでなくてはなりません。結果として それぞれのリストの最初の要素のリストを返します。 unzip2 はリストのリストを引数としてとります。それぞれのリストは 少くとも二つの要素を含むものでなくてはなりません。結果として二つの値を 返します。最初の要素のリストと二番目の要素のリストです。unzip3 は 3番目までの要素について同様です。以下も同様です。

 
(unzip2 '((1 one) (2 two) (3 three))) ⇒
   (1 2 3) and
   (one two three)
Function: count pred clist1 clist2 …

[SRFI-1] n をゼロから与えられたリストのうち最も短いリストの 長さまでとして、pred 手続きを与えられたリストの n 番目の要素に それぞれ適用します。 pred が真を返した数が返ります。

 
(count even? '(3 1 4 1 5 9 2 5 6)) ⇒ 3
(count < '(1 2 4 8) '(2 4 6 8 10 12 14 16)) ⇒ 3

引数で与えられるリストの少くともひとつは有限でなければなりません。

 
(count < '(3 1 4 1) (circular-list 1 10)) ⇒ 2

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

10.2.5 リストの畳み込み(fold)、解きほぐし(unfold)、および写像(map)

Function: fold kons knil clist1 clist2 …

[SRFI-1] 基本リスト反復演算子です。単一のリスト clist1 = (e1 e2en) を与えられたときには、以下を返します。

 
(kons en … (kons e2 (kons e1 knil)) … ) 

n 本のリストが与えられた場合には、kons 関数は n+1 個の引数 をとる関数でなければなりません。それぞれのリストから要素をひとつずつと、 初期値 knil である「種」あるいは畳み込み状態とよばれるものです。 この畳み込み演算は、もっとも短いリストの要素がなくなったところで終了します。 与えられるリストの少くともひとつは有限でなければなりません。

例:

 
(fold + 0 '(3 1 4 1 5 9)) ⇒ 23 ;sum up the elements
(fold cons '() '(a b c d e)) ⇒ (e d c b a) ;reverse
(fold cons* '() '(a b c) '(1 2 3 4 5))
    ⇒ (c 3 b 2 a 1) ;n-ary case
Function: fold-right kons knil clist1 clist2 …

[SRFI-1] 基本リスト再帰演算子です。単一のリスト clist1 = (e1 e2en) を与えられたときには、以下を返します。

 
(kons e1 (kons e2 … (kons en knil)))

n 本のリストが与えられた場合には、kons 関数は n+1 個の引数 をとる関数でなければなりません。それぞれのリストから要素をひとつずつと、 初期値 knil である「種」あるいは畳み込み状態とよばれものです。 この畳み込み演算は、もっとも短いリストの要素がなくなったところで終了します。 与えられるリストの少くともひとつは有限でなければなりません。

例:

 
(fold-right cons '() '(a b c d e))
   ⇒ (a b c d e) ;copy list
(fold-right cons* '() '(a b c) '(1 2 3 4 5))
   ⇒ (a 1 b 2 c 3) ;n-ary case
Function: pair-fold kons knil clist1 clist2 …
Function: pair-fold-right kons knil clist1 clist2 …

[SRFI-1] fold および fold-right と同様ですが、kons 手続き は与えられた clistcar ではなく、cdr をとります。

Function: reduce f ridentity list
Function: reduce-right f ridentity list

[SRFI-1] fold および fold-right の変形バージョンです。 f は二項演算子でなければなりません。 また、ridentityf の入力として許される あらゆる値 x について以下を満していなければなりません。

 
 (f x ridentity) ≡ x

これらの関数は実質的に foldfold-right と同じことを 行いますが、ridentityには上記の性質があるため、 fridentityには適用されません。 ridentityが使われるのはlistが空の場合だけです。

Function: unfold p f g seed &optional tail-gen

[SRFI-1] 基本リスト再帰構築子です。 以下のように再帰的に定義されています。

 
(unfold p f g seed tail-gen) ≡
   (if (p seed)
       (tail-gen seed)
       (cons (f seed)
             (unfold p f g (g seed))))

ここでは、p は終了位置の判定、g は現在の「種」から次の「種」 を生成するのに用い、f はそれぞれの「種」をリストの要素に変換する のに用いられます。

Function: unfold-right p f g seed &optional tail

[SRFI-1] 基本リスト反復構築子です。 以下のように再帰的に定義されています。

 
(unfold-right p f g seed tail) ≡
  (let lp ((seed seed) (lis tail))
    (if (p seed)
        lis
        (lp (g seed) (cons (f seed) lis))))
Function: append-map f clist1 clist2 …
Function: append-map! f clist1 clist2 …

[SRFI-1] 以下と同等です。

 
  (apply append (map f clist1 clist2 …))
  (apply append! (map f clist1 clist2 …))

引数のリストのうち少くともひとつは有限でなければなりません。

Function: map! f clist1 clist2 …

[SRFI-1] 手続き fclist1 の各要素と clist2 の対応する要素 に適用され、結果はひとつのリストになります。clist1 のセルは 結果のリストを構築するのに再利用されます。

Function: map-in-order f clist1 clist2 …

[SRFI-1] map の変形バージョンですが、f の適用順序が、引数として 与えられたリストの要素の左から右への順であることを保証します。 Gauche では map の実装はこの順になっているので、map と 同意です。

Function: pair-for-each f clist1 clist2 …

for-each と似ていますが、手続き f は各リスト clistcdr に適用されます。

Function: filter-map f clist1 clist2 …

map と似ていますが、真になる場合の値のみが保存されます。 引数として与えられるリストの少くともひとつは有限でなければなりません。

 
(filter-map (lambda (x) (and (number? x) (* x x)))
            '(a 1 b 3 c 7))
  ⇒ (1 9 49)

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

10.2.6 リストのフィルタおよび分割

Function: filter pred list
Function: filter! pred list

[SRFI-1] 手続き predlist の各要素に適用され、 pred が真を返す要素のリストが返されます。

 
(filter odd? '(3 1 4 5 9 2 6)) ⇒ (3 1 5 9)

filter! はその場で更新されるバージョンです。結果を生成するために list を破壊的に変更するかもしれません。

Function: remove pred list
Function: remove! pred list

[SRFI-1] 手続き predlist の各要素に適用され、 pred が偽を返す要素のリストが返されます。

 
(remove odd? '(3 1 4 5 9 2 6)) ⇒ (4 2 6)

remove! はその場で更新されるバージョンです。結果を生成するために list を破壊的に更新するかもしれません。

Function: partition pred list
Function: partition! pred list

[SRFI-1] filterremove は同時に、すなわち2つのリストを 返しますが、一つ目は pred により list の要素をフィルタリング した結果で、二つ目は pred により list の要素を削除した結果 です。

 
(partition odd? '(3 1 4 5 9 2 6))
  ⇒ (3 1 5 9) (4 2 6)

partition! はその場で更新されるバージョンです。結果を生成するために list を破壊的に更新するかもしれません。


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

10.2.7 リストの探索

Function: find pred clist

[SRFI-1] clist の各要素に対して左から右に pred を適用し、 pred が真を返す最初の要素を返します。predを満たす要素が 無い場合は#fを返します。

Function: find-tail pred clist

[SRFI-1] clist の各要素に対して左から右に pred を適用し、pred が 真を返す場合、その car がその要素であるペアを返します。 predを満たす要素が無い場合は#fを返します。

Function: take-while pred clist
Function: take-while! pred list

[SRFI-1] clist の最初から、pred を満足する限りの最長部分要素を返します。

Function: drop-while pred clist

[SRFI-1] clist の最初から、pred を満足する限りの最長部分要素を削除し、 残りを返します。

Function: span pred clist
Function: span! pred list
Function: break pred clist
Function: break! pred list

[SRFI-1] span(values (take-while pred clist) (drop-while pred clist)) と等価です。breakpred の意味を反転します。

Function: any pred clist1 clist2 …

[SRFI-1] clist の各要素に pred を適用し、predが偽でない 値を返したら直ちにその値を返します。 predが偽でない値を返す前にリストの要素を使いきってしまったら #fが返ります。

Function: every pred clist1 clist2 …

[SRFI-1] clist の各要素に pred を順に適用し、predが 偽を返した場合、直ちに偽を返します。全てのpredの適用が 偽でない値を返した場合は、最後に返された値が返されます。

Function: list-index pred clist1 clist2 …

[SRFI-1] pred を満足する最も左の要素のインデックスを返します。 predを満たす要素が無い場合は#fを返します。


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

10.2.8 リストの削除

Function: delete x list &optional elt=
Function: delete! x list &optional elt=

[SRFI-1] 以下と同等です。

 
  (remove (lambda (y) (elt= x y)) list)
  (remove! (lambda (y) (elt= x y)) list)

比較手続き elt= はデフォルトでは equal? です。

Function: delete-duplicates list &optional elt=
Function: delete-duplicates! list &optional elt=

[SRFI-1] list から重複した要素を取り除きます。list 中に等しい要素が 複数ある場合、一番左がわにある最初のものだけが残ります。これらの 生き残った要素間の順番は最初のリストの順番が保存されます。 比較手続き elt= のデフォルト値は、equal? です。


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

10.2.9 連想リスト

Function: alist-cons key datum alist

[SRFI-1] (cons (cons key datum) alist) を返します。 これは、Gauche の組み込み手続き acons の別名です。

Function: alist-copy alist

[SRFI-1] alist の新しい複製を返します。alist の背骨の部分、 およびキーと値を指す各セルは複製されます。

 
(define a (list (cons 'a 'b) (cons 'c 'd)))
a ⇒ ((a . b) (c . d))

(define b (alist-copy a))
b ⇒ ((a . b) (c . d))

(set-cdr! (car a) 'z)
a ⇒ ((a . z) (c . d))
b ⇒ ((a . b) (c . d))
Function: alist-delete key alist &optional =
Function: alist-delete! key alist &optional =

[SRFI-1] alist から keyと同じキーをもつすべてのセルを削除します。 比較は = で行います。これのデフォルト値は eqv? です。

その場で更新を行うバージョン alist-delete! は元の alist を変更してしまうことがあります。


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

10.2.10 集合としてのリスト

これらの手続きはリストを集合としてあつかいます。すなわち、どのような 要素があるかは重要ですが、その順序は重要ではありません。

この範疇にあるすべての手続きは、比較手続き elt= を最初の引数として とります。この比較手続きは与えられた二つの集合の要素が等しいかどうかを 判定します。

集合の要素の組み合せについては util.combinations - 組み合わせ も参照してください。

Function: lset<= elt= list1 …

[SRFI-1] list1 のすべての要素が list2 (以降の集合)に含まれている ときに限り #t を返します。リストが与えられなかった場合 および一つだけしか与えられなかった場合には、#t を返します。

Function: lset= elt= list1 list2 …

[SRFI-1] list1 のすべての要素が list2 に含まれており、かつ、 list2 のすべての要素が list1 に含まれていれば、#t を返します。

 
(lset= eq? '(b e a) '(a e b) '(e e b a)) ⇒ #t
Function: lset-adjoin elt= list elt …

[SRFI-1] elt … を集合 list にまだなければ、追加します。 (順序はとくに決っていません。)

 
(lset-adjoin eq? '(a b c) 'a 'e) ⇒ '(e a b c)
Function: lset-union elt= list1 …

[SRFI-1] list1 … の和集合を返します。

Function: lset-intersection elt= list1 list2 …

[SRFI-1] すべての list に含まれる要素の集合を返します。

Function: lset-difference elt= list1 list2 …

[SRFI-1] list1 には含まれていて、list2 には含まれていない要素の集合を 返します。引数が n 個与えられた場合には、差分をとる二項演算が 畳み込まれます。

Function: lset-xor elt= list1 …

[SRFI-1] 与えられた集合の排他的論理和を返します。すなわち、list1 および list2 のどちらか一方にのみ属する要素からなる集合を返します。 引数が n 個の場合には、xor の二項演算が畳み込まれます。

Function: lset-diff+intersection elt= list1 list2 …

[SRFI-1] 与えられた集合の差集合と積集合のふたつの集合を返します。

Function: lset-union! elt= list …
Function: lset-intersection! elt= list1 list2 …
Function: lset-difference! elt= list1 list2 …
Function: lset-xor! elt= list1 …
Function: lset-diff+intersection! elt= list1 list2 …

[SRFI-1] それぞれ対応する手続きのその場で更新するバージョンです。 最初の引数のリストのセルが結果を構築するのに再利用されるかもしれません。


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

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