For Gauche 0.9.5


Next: , Previous: , Up: ライブラリモジュール - SRFI   [Contents][Index]

11.1 srfi-1 - リストライブラリ

Module: srfi-1

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

GaucheはSRFI-1の手続きの多くを組み込みで提供しています。 以下に挙げるSRFI-1手続きはsrfi-1モジュールをロードしなくても使えます。 これらの手続きの説明は、ペアとリストを参照してください。

null-list? cons* last member
take drop take-right drop-right take! drop-right!
delete delete! delete-duplicates delete-duplicates!
assoc alist-copy alist-delete alist-delete!
any every filter filter! fold fold-right find find-tail
split-at split-at! iota

Next: , Previous: , Up: リストライブラリ   [Contents][Index]

11.1.1 SRFI-1 リスト操作関数

List constructors

Function: xcons cd ca

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

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 …)

List predicates

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).

List selectors

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) の二つの値を返します。

List miscellaneous routines

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)

List fold, unfold & map

Function: pair-fold kons knil clist1 clist2 …
Function: pair-fold-right kons knil clist1 clist2 …

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

(pair-fold cons '() '(a b c d e))
  ⇒ ((e) (d e) (c d e) (b c d e) (a b c d e))

(pair-fold-right cons '() '(a b c d e))
  ⇒ ((a b c d e) (b c d e) (c d e) (d e) (e))
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 はそれぞれの「種」をリストの要素に変換する のに用いられます。

(unfold (pa$ = 53) integer->char (pa$ + 1) 48)
  ⇒ (#\0 #\1 #\2 #\3 #\4)
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))))
(unfold-right (pa$ = 53) integer->char (pa$ + 1) 48)
 ⇒ (#\4 #\3 #\2 #\1 #\0)
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 はまず clist自体に 適用され、次ににそれらのcdr に適用され、となります。

(pair-for-each write '(a b c))
 ⇒ prints (a b c)(b c)(c)

List partitioning

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 を破壊的に更新するかもしれません。

List searching

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: list-index pred clist1 clist2 …

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

Association lists

Function: alist-cons key datum alist

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


Previous: , Up: リストライブラリ   [Contents][Index]

11.1.2 集合としてのリスト

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

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

リストは検索に線形時間を必要とするため、ここに挙げた手続きは 大きな集合を扱うには向いていません。もし対象となる集合が 二桁以上の要素を持つことが分かっているなら、setとbagを 参照してください。

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

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


Previous: , Up: リストライブラリ   [Contents][Index]