[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
srfi-1
- List library SRFI-1 は、リスト操作ライブラリの豊富なコレクションです
(SRFI-1)。
このライブラリを使うには、(use srfi-1)
として下さい。
Olin Shivers氏のリファレンス実装に基づいて実装されています。
10.2.1 リストの構築子 | ||
10.2.2 リストの述語 | ||
10.2.3 リスト選択子 | ||
10.2.4 種々のリスト処理ルーチン | ||
10.2.5 リストの畳み込み(fold)、解きほぐし(unfold)、および写像(map) | ||
10.2.6 リストのフィルタおよび分割 | ||
10.2.7 リストの探索 | ||
10.2.8 リストの削除 | ||
10.2.9 連想リスト | ||
10.2.10 集合としてのリスト |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[SRFI-1] (cons ca cd)
と同等です。高階手続きへ渡すのに便利です。
[SRFI-1] list
と似ていますが、最後の引数が構築されたリストの
末尾になります。Gauche の組み込み手続き list*
と同意です。
(cons* 1 2 3 4) ⇒ (1 2 3 . 4) (cons* 1) ⇒ 1 |
[SRFI-1] n個の要素をもつリストを構築し、それぞれの要素を
(init-proc i)
で生成します。
(list-tabulate 4 values) ⇒ (0 1 2 3) |
[SRFI-1] 指定した要素をもつ循環リストを構築します。
(circular-list 'z 'q) ⇒ (z q z q z q …) |
[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] | [ ? ] |
[SRFI-1] x が真性リストであれば #t
を返します。
[SRFI-1] x が循環リストであれば #t
を返します。
[SRFI-1] x が有限の大きさで、空リストで終端していないリストなら
#t
を返します。これには、ペアではなく、空リストもない値(たとえば
シンボルや数値)のような長さ0のドットリストと考えられるものを含みます。
[SRFI-1] list が空リスト ()
なら #t
を返します。
それ以外のときは #f を返します。
[SRFI-1] (lambda (x) (not (pair? x)))
と同じです。
SRFI-1 では、「真性リストおよびドットリストの両方で、すべての有限リストを 扱う手続き用の終端条件として便利なように用意した」とあります。
[SRFI-1] elt= を用いて、n番目の要素をそれぞれ比較することで、 与えられたリストの同値性を決定します。
list=
を真性リスト以外に適用するとエラーになります。
同値性判定の手続きは eq?
と整合性がなければなりません。すなわち
(eq? x y) ⇒ (elt= x y). |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[SRFI-1] リスト(非真性でも可)のn番目の要素を返します。
[SRFI-1] (car pair)
および (cdr pair)
の二つの値を返します。
[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 |
drop
は x に i 回 cdr 操作をおこなうのと全く
同じです。返される値は、x と共通の末尾を共有します。一方、
take は、引数のリストが長さ0でないリストなら必ず新しいリストの
領域を確保します。
i がリスト x の終端を超えたらエラーが発生します。
より寛容なバージョンの take
と drop
については、
See section util.list
- その他のリストライブラリ を参照してください。
あらゆる並びからの部分並びを抽出する汎用的な方法に関しては、
シーケンスのスライス にある subseq
を参照してください。
[SRFI-1] take-right
は flist の最後の i個の要素
からなるリストを返します。
drop-right
は flist の最後の 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-right
と drop-right
については、
See section util.list
- その他のリストライブラリ を参照してください。
[SRFI-1] take および drop-right の その場で更新されるバージョンです。これらの 手続きは x を破壊的に変更するかもしれません。
x が循環リストなら、take!
は期待されるものより短いリストを返す
可能性があります。
[SRFI-1] split-at
はリスト x をインデックス i の
位置で分割し、最初の i 個の要素からなるリストと、残りの末尾とを
返します。
(split-at '(a b c d e) 2) ⇒ (a b) (c d e) |
split-at!
はその場で更新されるバージョンです。
これは x を破壊的に更新するかもしれません。
[SRFI-1] 空ではない有限リスト pair の最後の要素を返します。
これは、(car (last-pair pair))
と同等です。
註: last-pair
は Gauche の組み込み手続きです。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[SRFI-1] x が真性リストなら、その長さを返します。さもなければ、
#f
を返します。
[SRFI-1] それぞれ、(apply append list-of-lists)
および
(apply append! list-of-lists)
と同等です。
[SRFI-1] append-reverse
は (append (reverse rev-head) tail)
を
返します。append-reverse!
はその場で更新されるバージョンです。
[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)) |
[SRFI-1] unzip1
はリストのリストを引数としてとります。それぞれの
リストは少くとも一つの要素を含むものでなくてはなりません。結果として
それぞれのリストの最初の要素のリストを返します。
unzip2
はリストのリストを引数としてとります。それぞれのリストは
少くとも二つの要素を含むものでなくてはなりません。結果として二つの値を
返します。最初の要素のリストと二番目の要素のリストです。unzip3
は
3番目までの要素について同様です。以下も同様です。
(unzip2 '((1 one) (2 two) (3 three))) ⇒
(1 2 3) and
(one two three)
|
[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] | [ ? ] |
[SRFI-1] 基本リスト反復演算子です。単一のリスト clist1 = (e1 e2 … en) を与えられたときには、以下を返します。
(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 |
[SRFI-1] 基本リスト再帰演算子です。単一のリスト clist1 = (e1 e2 … en) を与えられたときには、以下を返します。
(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 |
[SRFI-1]
fold
および fold-right
と同様ですが、kons 手続き
は与えられた clist の car
ではなく、cdr
をとります。
[SRFI-1]
fold
および fold-right
の変形バージョンです。
f は二項演算子でなければなりません。
また、ridentity は f の入力として許される
あらゆる値 x について以下を満していなければなりません。
(f x ridentity) ≡ x |
これらの関数は実質的に fold
や fold-right
と同じことを
行いますが、ridentityには上記の性質があるため、
fはridentityには適用されません。
ridentityが使われるのはlistが空の場合だけです。
[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 はそれぞれの「種」をリストの要素に変換する のに用いられます。
[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)))) |
[SRFI-1] 以下と同等です。
(apply append (map f clist1 clist2 …)) (apply append! (map f clist1 clist2 …)) |
引数のリストのうち少くともひとつは有限でなければなりません。
[SRFI-1] 手続き f は clist1 の各要素と clist2 の対応する要素 に適用され、結果はひとつのリストになります。clist1 のセルは 結果のリストを構築するのに再利用されます。
[SRFI-1] map
の変形バージョンですが、f の適用順序が、引数として
与えられたリストの要素の左から右への順であることを保証します。
Gauche では map
の実装はこの順になっているので、map
と
同意です。
for-each
と似ていますが、手続き f は各リスト clist の
cdr
に適用されます。
map
と似ていますが、真になる場合の値のみが保存されます。
引数として与えられるリストの少くともひとつは有限でなければなりません。
(filter-map (lambda (x) (and (number? x) (* x x))) '(a 1 b 3 c 7)) ⇒ (1 9 49) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[SRFI-1] 手続き pred が list の各要素に適用され、 pred が真を返す要素のリストが返されます。
(filter odd? '(3 1 4 5 9 2 6)) ⇒ (3 1 5 9) |
filter!
はその場で更新されるバージョンです。結果を生成するために
list を破壊的に変更するかもしれません。
[SRFI-1] 手続き pred が list の各要素に適用され、 pred が偽を返す要素のリストが返されます。
(remove odd? '(3 1 4 5 9 2 6)) ⇒ (4 2 6) |
remove!
はその場で更新されるバージョンです。結果を生成するために
list を破壊的に更新するかもしれません。
[SRFI-1] filter
と remove
は同時に、すなわち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] | [ ? ] |
[SRFI-1] clist の各要素に対して左から右に pred を適用し、
pred が真を返す最初の要素を返します。predを満たす要素が
無い場合は#f
を返します。
[SRFI-1]
clist の各要素に対して左から右に pred を適用し、pred が
真を返す場合、その car がその要素であるペアを返します。
predを満たす要素が無い場合は#f
を返します。
[SRFI-1] clist の最初から、pred を満足する限りの最長部分要素を返します。
[SRFI-1] clist の最初から、pred を満足する限りの最長部分要素を削除し、 残りを返します。
[SRFI-1]
span
は (values (take-while pred clist) (drop-while pred clist))
と等価です。break
は pred の意味を反転します。
[SRFI-1]
clist の各要素に pred を適用し、predが偽でない
値を返したら直ちにその値を返します。
predが偽でない値を返す前にリストの要素を使いきってしまったら
#f
が返ります。
[SRFI-1] clist の各要素に pred を順に適用し、predが 偽を返した場合、直ちに偽を返します。全てのpredの適用が 偽でない値を返した場合は、最後に返された値が返されます。
[SRFI-1]
pred を満足する最も左の要素のインデックスを返します。
predを満たす要素が無い場合は#f
を返します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[SRFI-1] 以下と同等です。
(remove (lambda (y) (elt= x y)) list) (remove! (lambda (y) (elt= x y)) list) |
比較手続き elt= はデフォルトでは equal?
です。
[SRFI-1]
list から重複した要素を取り除きます。list 中に等しい要素が
複数ある場合、一番左がわにある最初のものだけが残ります。これらの
生き残った要素間の順番は最初のリストの順番が保存されます。
比較手続き elt= のデフォルト値は、equal?
です。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
[SRFI-1] (cons (cons key datum) alist)
を返します。
これは、Gauche の組み込み手続き acons
の別名です。
[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)) |
[SRFI-1]
alist から keyと同じキーをもつすべてのセルを削除します。
比較は = で行います。これのデフォルト値は eqv?
です。
その場で更新を行うバージョン alist-delete!
は元の
alist を変更してしまうことがあります。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらの手続きはリストを集合としてあつかいます。すなわち、どのような 要素があるかは重要ですが、その順序は重要ではありません。
この範疇にあるすべての手続きは、比較手続き elt= を最初の引数として とります。この比較手続きは与えられた二つの集合の要素が等しいかどうかを 判定します。
集合の要素の組み合せについては util.combinations
- 組み合わせ
も参照してください。
[SRFI-1]
list1 のすべての要素が list2 (以降の集合)に含まれている
ときに限り #t
を返します。リストが与えられなかった場合
および一つだけしか与えられなかった場合には、#t
を返します。
[SRFI-1]
list1 のすべての要素が list2 に含まれており、かつ、
list2 のすべての要素が list1 に含まれていれば、#t
を返します。
(lset= eq? '(b e a) '(a e b) '(e e b a)) ⇒ #t |
[SRFI-1] elt … を集合 list にまだなければ、追加します。 (順序はとくに決っていません。)
(lset-adjoin eq? '(a b c) 'a 'e) ⇒ '(e a b c) |
[SRFI-1] list1 … の和集合を返します。
[SRFI-1] すべての list に含まれる要素の集合を返します。
[SRFI-1] list1 には含まれていて、list2 には含まれていない要素の集合を 返します。引数が n 個与えられた場合には、差分をとる二項演算が 畳み込まれます。
[SRFI-1] 与えられた集合の排他的論理和を返します。すなわち、list1 および list2 のどちらか一方にのみ属する要素からなる集合を返します。 引数が n 個の場合には、xor の二項演算が畳み込まれます。
[SRFI-1] 与えられた集合の差集合と積集合のふたつの集合を返します。
[SRFI-1] それぞれ対応する手続きのその場で更新するバージョンです。 最初の引数のリストのセルが結果を構築するのに再利用されるかもしれません。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.