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

11.46 util.list - その他のリストライブラリ

Module: util.list

このモジュールは、srfi-1 (srfi-1 - List library参照)にはないが、 一般的に便利なリストユーティリティ関数を提供します。

リストに対して用いることができる便利なジェネリック関数を定義している gauche.collection - コレクションフレームワークgauche.sequence - シーケンスフレームワークも 見て下さい。

Function: take* list k &optional fill? padding

listの最初のk個の要素で構成されるリストを返します。 これは、SRFI-1のtakeに似ていますが、この手続きのほうが 寛容です。つまり、listkよりも短いとき、take*は エラーを通知しません。その代わり、デフォルトで(あるいは、オプショナル 引数fill?#fの場合)listのコピーを返します。 fill?が真の場合、その長さをkにするために、paddingが その結果に追加されます。paddingのデフォルト値は#fです。

 
(take* '(a b c d) 3)       ⇒ (a b c)
(take* '(a b c d) 6)       ⇒ (a b c d)
(take* '(a b c d) 6 #t)    ⇒ (a b c d #f #f)
(take* '(a b c d) 6 #t 'z) ⇒ (a b c d z z)

注意: 一般的な、いかなるシーケンスからのサブシーケンスの抽出については、 シーケンスのスライスsubseqを見て下さい。

Function: drop* list k

listの最初のk個の要素が削除されたリストを返します。 これは、SRFI-1のdropに似ていますが、この手続きのほうが 寛容です。listkよりも短い場合、空リストが返されます。

 
(drop* '(a b c d) 3)       ⇒ (d)
(drop* '(a b c d) 5)       ⇒ ()
Function: take-right* list k &optional fill? padding

take*と同じですが、listの右端からカウントします。 必要ならば、結果の左にpaddingが追加されます。

Function: drop-right* list k

drop*と同じですが、listの右端からカウントします。

Function: split-at* list k &optional fill? padding

SRFI-1のsplit-atの寛容なバージョンです。 take*drop*の結果を返します。

 
(split-at* '(a b c d) 6 #t 'z)
  ⇒ (a b c d z z) and ()
Function: slices list k &optional fill? padding

listを、それぞれの長さがkであるようなサブリスト(スライス)に 分割します。 listの長さがkの整数倍でない場合は、最後のスライスは take*と同じ方法で扱われます。つまり、デフォルトではkより 短いもの、あるいはfill?が真ならばpaddingが追加されます。

 
(slices '(a b c d e f g) 3)
  ⇒ ((a b c) (d e f) (g))
(slices '(a b c d e f g) 3 #t 'z)
  ⇒ ((a b c) (d e f) (g z z))
Function: intersperse item list

listの要素の間にitemを挿入します。 (引数の順番は、Haskellのintersperseと同じです。)

 
(intersperse '+ '(1 2 3))  ⇒ (1 + 2 + 3)
(intersperse '+ '(1))      ⇒ (1)
(intersperse '+ '())       ⇒ ()
Macro: cond-list clause …

条件によりエントリを追加することによりリストを構築します。 それぞれのclauseは条件と式を持ちます。 条件が真であれば、関連する式の結果が結果のリストの構築に使われます。 条件が偽であれば、何も挿入されません。

clauseは、以下のフォームのうちの1つでなければなりません。

(test expr …)

testが評価され、それが真ならばexpr …が評価され、 戻り値が結果の一部となります。exprが与えられなければ、 testの結果が偽でなければその結果が使われます。

(test => proc)

testが評価され、それが真ならばprocがその値とともに 呼ばれ、その戻り値が結果を構築するために使われます。

(test @ expr …)

(test expr …)のように動作しますが、最後のexprの 値はリストでなければならず、それは結果のリストに(unquote-splicingのように) スプライスされます。

(test => @ proc)

(test => proc)のように動作しますが、procの戻り値 はリストでなければならず、それは結果のリストに(unquote-splicingのように) スプライスされます。

 
(let ((alist '((x 3) (y -1) (z 6))))
 (cond-list ((assoc 'x alist) 'have-x)
            ((assoc 'w alist) 'have-w)
            ((assoc 'z alist) => cadr)))
  ⇒ (have-x 6)

(let ((x 2) (y #f) (z 5))
  (cond-list (x @ `(:x ,x))
             (y @ `(:y ,y))
             (z @ `(:z ,z))))
  ⇒ (:x 2 :z 5)
Function: alist->hash-table alist &optional cmp

alistに含まれるそれぞれの要素をエントリとして持つハッシュテーブルを 作成して返します。その時、要素のcarがキーとして、要素のcdrが値として 使われます。cmpは作成されたハッシュテーブルの比較関数を 指定するシンボルで、現在はeq?eqv?equal?string=?がサポートされています。

Function: hash-table->alist hash-table
 
  (hash-table-map h cons)
Function: rassoc key alist &optional eq-fn
Function: rassq key alist
Function: rassv key alist

与えられるkeyalistのそれぞれの要素で、carの代わりに cdrにマッチするような逆になった連想リストです。 両方向の連想リストと理解すると簡単です。 rassocは、そのデフォルトがequal?である、オプションの 比較関数を取ります。rassqeq?rassveqv?を 使います。

Function: assoc-ref alist key &optional default eq-fn
Function: assq-ref alist key &optional default
Function: assv-ref alist key &optional default

これらの手続きは、他の*-ref手続きと対照的な連想リストへの アクセスを提供します。これは、一般的な連想リストアクセスのパターン です。

 
(assoc-ref alist key default eq-fn)
 ≡
  (cond ((assoc key alist eq-fn) => cdr)
        (else default))))

defaultが省略されると、#fが使われます。

assoc-refは、そのデフォルトがequal?である、オプションの 比較関数eq-fnを取ります。assq-refeq?を、 assv-refeqv?をそれぞれ使います。

Function: rassoc-ref alist key &optional default eq-fn
Function: rassq-ref alist key &optional default
Function: rassv-ref alist key &optional default

assoc-refの逆連想リストバージョンです。

 
(rassoc-ref alist key default eq-fn)
 ≡
  (cond ((rassoc key alist eq-fn) => car)
        (else default))))

オプショナル引数の意味は、assoc-refと同じです。

Function: assoc-set! alist key val &optional eq-fn
Function: assq-set! alist key val
Function: assv-set! alist key val

alist(key . val)のペアが追加された連想リストを返します。 alistがすでにkeyをキーとする要素を持っている場合、 その要素のcdrは破壊的にvalに変更されます。 alistkeyをキーとする要素を持っていない場合は、 新しいペアが作成され、alistの一番前に追加されます。 したがって、key-valペアが追加されたことを保証するために その戻り値を使うべきです。

assoc-set!は、そのデフォルトがequal?である、オプションの 比較関数eq-fnを取ります。assq-set!eq?を、 assv-set!eqv?を、それぞれ使います。


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

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