For Gauche 0.9.5


Next: , Previous: , Up: 組み込みライブラリ   [Contents][Index]

6.14 ベクタ

Builtin Class: <vector>

ベクタはSchemeオブジェクトの単純な一次元配列です。 インデックスを用いて定数時間でその要素にアクセスできます。 一度作成されたベクタはその大きさを変えることはできません。

<vector>クラスはまた<sequence>クラスを継承し、 mapfoldなど様々な総称関数を使うことができます。 コレクションフレームワークシーケンスフレームワーク を参照して下さい。

数値しか要素に持たないベクタを使う場合、SRFI-4の 単一型ベクタも使えるかもしれません (単一型のベクタ参照)。

R7RSはバイトベクタを定義しています。Gaucheではそれは単に gauche.uvectorモジュールのu8vectorです (R7RSモジュールは別名を定義しています。R7RS基本ライブラリ参照。)

より多くのベクタに対する操作がベクタライブラリで提供されています。

Function: vector? obj

[R7RS] objがベクタなら#tを、そうでなければ#fを返します。

Function: make-vector k :optional fill

[R7RS] 長さkのベクタを作成して返します。 省略可能な引数fillが与えられていれば、ベクタの各要素はその値で 初期化されます。そうでなければベクタの各要素の値は不定です。

Function: vector obj …

[R7RS] 要素がobj …であるようなベクタを作成して返します。

Function: vector-tabulate len proc

長さlenのベクタを作成し、0以上len未満のiについて i番目の要素を(proc i)の値で初期化します。

(vector-tabulate 5 (^x (* x x)))
  ⇒ #(0 1 4 9 16)
Function: vector-length vector

[R7RS] ベクタvectorの長さを返します。

gauche.collectionモジュールをロードしていれば、 メソッドsize-ofも同じ目的で使えます。

Function: vector-ref vector k :optional fallback

[R7RS+] ベクタvectork番目の要素を返します。

vector-refkが負の値であったりベクタの長さより 大きかったりした場合はエラーを通知します。但し、省略可能な引数fallback が与えられている場合はその値が返されます。これはGaucheの拡張です。

gauche.sequenceモジュールをロードしていれば、 メソッドrefも同じ目的で使えます。

Function: vector-set! vector k obj

[R7RS] ベクタvectork番目の要素をobjに変更します。 kが負数であったりベクタの長さより大きい場合はエラーとなります。

gauche.sequenceモジュールをロードしていれば、 メソッドrefのsetterメソッドも使えます。

Function: vector->list vector :optional start end
Function: list->vector list :optional start end

[R7RS+][SRFI-133+] ベクタをリストに変換したり、その逆を行う手続きです。

省略可能な引数startendを与えることにより、 値を取り出す範囲を制限することができます。 (R7RSおよびSRFI-133のlist->vectorstartend引数を規定していません。)

(vector->list '#(1 2 3 4 5))     ⇒ (1 2 3 4 5)
(list->vector '(1 2 3 4 5))      ⇒ #(1 2 3 4 5)
(vector->list '#(1 2 3 4 5) 2 4) ⇒ (3 4)
(list->vector (circular-list 'a 'b 'c) 1 6)
  ⇒ #(b c a b c)

gauche.collectionモジュールをロードしていれば、 (coerce-to <list> vector)(coerce-to <vector> list) も同じ目的で使えます。

Function: reverse-list->vector list :optional start end

[SRFI-133] 省略可能引数が無い場合、 (list->vector (reverse list))と同じ結果を返しますが、 中間リストを作りません。省略可能引数startおよびendが 与えられた場合は、それはlistの範囲を指定します。

(reverse-list->vector '(a b c d e f g) 1 5)
  ⇒ #(e d c b)
Function: vector->string vector :optional start end
Function: string->vector string :optional start end

[R7RS] 文字のベクタを文字列に変換したり、その逆を行う手続きです。 vector->stringに、文字以外の要素を含むベクタを渡した場合はエラーになります。

省略可能な引数startendを与えることにより、 値を取り出す範囲を制限することができます。

(vector->string '#(#\a #\b #\c #\d #\e))     ⇒ "abcde"
(string->vector "abcde")                     ⇒ #(#\a #\b #\c #\d #\e)
(vector->string '#(#\a #\b #\c #\d #\e) 2 4) ⇒ ("cd")

gauche.collectionモジュールをロードしていれば、 (coerce-to <string> vector)(coerce-to <vector> string) も同じ目的で使えます。

Function: vector-fill! vector fill :optional start end

[R7RS][SRFI-133] ベクタvectorの全ての要素をfillに変更します。

省略可能な引数startendが与えられた場合、 start番目の要素からend-1番目の要素までのみに fillを格納します。startendの既定値は それぞれ0とvectorの大きさです。

Function: vector-copy vector :optional start end fill

[R7RS][SRFI-133] ベクタvectorをコピーします。引数startendを与えることで コピーされる範囲を制限することができます。 startendで指定される範囲が元のvectorの範囲を越えた 場合は、その部分がfillで埋められます。

(vector-copy '#(1 2 3 4 5))     ⇒ #(1 2 3 4 5)
(vector-copy '#(1 2 3 4 5) 2 4) ⇒ #(3 4)
(vector-copy '#(1 2 3 4 5) 3 7 #f) ⇒ #(4 5 #f #f)
Function: vector-copy! target tstart source :optional sstart send

[R7RS][SRFI-133] ベクタsourceの内容をベクタtargetのインデックスtstart以降に コピーします。targetは変更可能でなければなりません。 省略可能なsstartsend引数はコピー元ベクタの範囲を限定します。

(rlet1 v (vector 'a 'b 'c 'd 'e)
  (vector-copy! v 2 '#(1 2)))
  ⇒ #(a b 1 2 e)
(rlet1 v (vector 'a 'b 'c 'd 'e)
  (vector-copy! v 2 '#(1 2 3 4) 1 3))
  ⇒ #(a b 2 3 e)

コピーされるデータが、コピー先の領域(tstartから末尾まで)より 大きい場合はエラーが報告されます。

targetsourceに同じベクタを渡しても構いません。 コピー元とコピー先の領域に重なりがある場合でもこの手続きは使えます。

Function: vector-append vec …

[R7RS][SRFI-133] ベクタvecを順に継ぎ足した内容を持つベクタを新たに作成して返します。

(vector-append '#(1 2 3) '#(a b)) ⇒ #(1 2 3 a b)
(vector-append) ⇒ #()
Function: vector-map proc vec1 vec2 …

[R7RS][SRFI-133] ベクタvec1 vec2 …の各i番目の要素にprocを 適用したものをi番目の要素とする新たなベクタを作って返します。 結果のベクタの長さは、引数のベクタのうち最も短いものと同じになります。

(vector-map + '#(1 2 3) '#(4 5 6 7))
 ⇒ #(5 7 9)

procが呼ばれる順番は定義されておらず、将来のバージョンで変わるかもしれないので、 procでは順序に影響されるような副作用を起こしてはいけません。

註: gauche.collectionをuseして (map-to <vector> proc vec1 vec2 … としても同じ機能は得られます。

Function: vector-map-with-index proc vec1 vec2 …

vector-mapと似ていますが、procの第1引数に 現在のインデックスが渡されます。

(vector-map-with-index list '#(a b c d e) '#(A B C))
 ⇒ #((0 a A) (1 b B) (2 c C))

これがSRFI-43でvector-mapと呼ばれている手続きです。 ベクタライブラリ(旧式)参照。

註: gauche.collectionをuseして (map-to-with-index <vector> proc vec1 vec2 … としても同じ機能は得られます。

Function: vector-map! proc vec1 vec2 …

[SRFI-133] 各インデックスiについて、ベクタvec1 vec2 …の i番目の要素を引数としてprocを呼び出した結果、vec1i番目の要素にセットします。ベクタの長さが異なる場合は最も短いベクタ の範囲が計算されます。

(rlet1 v (vector 1 2 3)
  (vector-map! ($ + 1 $) v))
  ⇒ #(2 3 4)

(rlet1 v (vector 1 2 3 4)
  (vector-map! + v '#(10 20)))
  ⇒ #(11 22 3 4)
Function: vector-map-with-index! proc vec1 vec2 …

vector-map!と似ていますが、procの第1引数に 現在のインデックスが渡されます。SRFI-43でvector-map! と定義されているものと同じ動作です (ベクタライブラリ(旧式)参照)。

(rlet1 v (vector 'a 'b 'c)
  (vector-map-with-index! list v))
  ⇒ #((0 a) (1 b) (2 c))
Function: vector-for-each proc vec1 vec2 …

[R7RS][SRFI-133] 0から渡されたベクタのうち一番短いものの最大のインデックスまでのiについて、 vec1 vec2 …のそれぞれi番目の要素を引数に procを呼び出します。

(vector-for-each print '#(a b c))
 ⇒ prints a, b and c.
Function: vector-for-each-with-index proc vec1 vec2 …

vector-for-eachと似ていますが、procの第1引数に 現在のインデックスが渡されます。

この手続きはSRFI-43のvector-for-eachと等価です。 ベクタライブラリ(旧式)参照。


Next: , Previous: , Up: 組み込みライブラリ   [Contents][Index]