For Development HEAD DRAFTSearch (procedure/syntax/module):

11.12 srfi.43 - ベクタライブラリ(旧式)

Module: srfi.43

このモジュールは実効的に、R7RSとSRFI-133に取って代わられています。 いくつかの手続きはR7RSやSRFI-133の同名の手続きとは非互換で、 このモジュールはSRFI-43に依存している既存のコードのためだけに 残されています。

「現代的な」ベクタライブラリは、ベクタscheme.vector - R7RSベクタ で説明されています。新たなコードはそちらを使うべきです。

以下のSRFI-43の手続きは組み込みになっています。 説明はベクタを参照してください。

make-vector     vector          vector?         vector-ref
vector-set!     vector-length   vector-fill!    vector-copy
vector-copy!    vector-append   vector->list    list->vector
reverse-list->vector

以下のSRFI-43の手続きはSRFI-133でも同様にサポートされています。 説明はscheme.vector - R7RSベクタを参照してください。

vector-unfold         vector-unfold-right   vector-reverse-copy
vector-reverse-copy!  vector-concatenate    vector-empty?
vector=               vector-index          vector-index-right
vector-skip           vector-skip-right     vector-binary-search
vector-any            vector-every          vector-swap!
reverse-vector->list

ここでは上に挙げられていない手続きを説明します。

Function: vector-fold kons knil vec1 vec2 …
Function: vector-fold-right kons knil vec1 vec2 …

[SRFI-43]{srfi.43} SRFI-133のvector-foldvector-fold-rightと似ていますが、 kons手続きは追加で、現在のインデックスを第一引数として取ります。 従って、nを引数で与えられたベクタの数とすると、 konsn+2個の引数を取らなければなりません。 kons(kons <index> <cumulated-value> <elt1> <elt2> ...) のように呼ばれます。

Gaucheにはfold-with-indexがあって、ベクタをインデックスつきで foldするのに使えます(シーケンス上のマップ)が、 konsが受け取る引数の順序が違います: インデックスの次に 各ベクタの要素、そして最後に累積された値が来ます。

(use srfi.43)
(vector-fold list '() '#(a b c) '#(d e f))
  ⇒ (2 (1 (0 () a d) b e) c f)

(use gauche.sequence)
(fold-with-index list '() '#(a b c) '#(d e f))
  ⇒ (2 c f (1 b e (0 a d ())))
Function: vector-map f vec1 vec2 …
Function: vector-map! f vec1 vec2 …
Function: vector-for-each f vec1 vec2 …
Function: vector-count f vec1 vec2 …

[SRFI-43]{srfi.43} R7RSのvector-mapおよびvector-for-each、 そしてsrfi-133vector-map!およびvector-coutと ほぼ同じですが、fが現在のインデックスを最初の引数として(他の引数より前に) 取ります。

GaucheはSRFI-43のvector-mapvector-map!vector-for-each互換な手続きをそれぞれ vector-map-with-indexvector-map-with-index!vector-for-each-with-indexという 名前で提供しています。ベクタ参照。

(vector-map list '#(a b c))
 ⇒ #((0 a) (1 b) (2 c))
(vector-map list '#(a b c) '#(d e f g))
 ⇒ #((0 a d) (1 b e) (2 c f))
(vector-count = '#(0 2 2 4 4))
 ⇒ 3

(註: vector-count=を二つの引数、現在のインデックスと ベクタの要素で呼び出します。従ってこの例は、ベクタの要素がインデックスと一致する 場合を数えています。)

gauche.collectionのジェネリックなmapfor-eachは ベクタに対しても使えますが、マップされる手続きはインデックスを取らず、 また結果はリストになります。 (vector-map f vec1 vec2 …)は機能的には (map-to-with-index <vector> f vec1 vec2 …)と同じになります。 詳しくはgauche.collection - コレクションフレームワークgauche.sequence - シーケンスフレームワークを参照してください。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT