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

11.51 srfi.210 - 多値のための手続きと構文

Module: srfi.210

このモジュールは、複数の値を返す式を通常の単一の値を扱う式にうまく混ぜて使えるようにする マクロや手続きを提供します。

Macro: with-values producer consumer

[SRFI-210]{srfi.210} (call-with-values (^[] producer) consumer)の略記です。

Macro: case-receive producer clause …

[SRFI-210]{srfi.210} (with-values producer (case-lambda clause …))の略記です。

Macro: apply/mv operator operand … producer

[SRFI-210]{srfi.210} applyと似ていますが、最後の引数producerは複数の値を返すことができ、 それがoperatorへの引数リストの末尾に付け加えられます。 つまり(apply operator operand … (values->list producer))と同じです。

Macro: call/mv proc producer …

[SRFI-210]{srfi.210} producer …の各式が返す多値をリストにしてつなぎあわせたものを 引数リストにしてprocを呼び出します。

(call/mv list (values 1 2 3) (values 4 5 6))
  ⇒ (1 2 3 4 5 6)
Macro: list/mv element … producer
Macro: vector/mv element … producer
Macro: box/mv element … producer

[SRFI-210]{srfi.210} element …および、producerが返す多値のそれぞれを要素とする リスト、ベクタ、ボックスを作って返します。

list/mvに引数をひとつだけ渡した場合は、Gauche組み込みのvalues->list と同じです(多値参照)。

(list/mv 1 2 (values 3 4 5))   ⇒ (1 2 3 4 5)
(vector/mv 1 2 (values 3 4 5)) ⇒ #(1 2 3 4 5)
(box/mv 1 2 (values 3 4 5))    ⇒ #<mv-box[5] 1 2 3 4 5>
Macro: value/mv index element … producer

[SRFI-210]{srfi.210} (list-ref (list/mv element … producer) index)と同じ値を返します。

element …が無い場合は、Gauche組み込みのvalues-refの 引数順をひっくり返したものになります(多値参照)。

Macro: coarity producer

[SRFI-210]{srfi.210} producerを評価し、結果の値の数を返します。

Macro: bind/mv producer transducer …

[SRFI-210]{srfi.210} producerを評価し、その結果の値(複数かもしれない)を引数として 最初のtransducerを呼びます。それが値(複数かもしれない)を返したらそれらを 引数として二番目のtransducerを呼び、以下同様にして最後のtransducerが 返す値(複数かもしれない)を返します。最後のtransducerは末尾呼び出しされます。

transducerが与えられなければ、producerの結果の値(複数かもしれない)が そのまま返されます。

Function: list-values lis
Function: vector-values vec
Function: box-values box

[SRFI-210]{srfi.210} リストlis、ベクタvec、ボックスboxの中身を複数の値として返します。

box-valuesunboxと同じですが、 名前付けの一貫性のために用意されています (ボックス参照)。

Function: value index obj …

[SRFI-210]{srfi.210} obj …のindex番目の値を返します。

Function: identity obj …

[SRFI-210]{srfi.210} valuesと同じです。 Gaucheの組み込みのidentityはこれと違い正確に一つの値だけを取ることに 注意してください (コンビネータ参照)。

Function: compose-left transducer …

[SRFI-210]{srfi.210} 各transducerは手続きでなければなりません。 合成された手続きを返します。その手続きは、渡された引数をまず最初のtransducer に渡し、その結果(複数かもしれない)を次のtransducerに渡し、ということを続けて 最後のtransducerの結果(複数かもしれない)を返します。 tranducerがひとつも渡されない場合はvaluesと同じです。

これはGauche組み込みのcomposeを使って次のように書けます(コンビネータ参照)。

(define (compose-left . procs) (apply compose (reverse procs)))
Function: compose-right transducer …

[SRFI-210]{srfi.210} 各transducerは手続きでなければなりません。 合成された手続きを返します。その手続きは、渡された引数をまず最後のtransducer に渡し、その結果(複数かもしれない)をひとつ前のtransducerに渡し、ということを続けて 最初のtransducerの結果(複数かもしれない)を返します。 tranducerがひとつも渡されない場合はvaluesと同じです。

これはGauche組み込みのcomposeと同じです(コンビネータ参照)。

Function: map-values proc

[SRFI-210]{srfi.210} 手続きを作って返します。その手続きは、任意個の引数を取り、それぞれにprocを適用して、 その結果を多値として返すものです。 procが一つ以外の値を返した場合の動作は未定義です。

((map-values (cut + <> 1)) 1 2 3)
  ⇒ 2, 3, 4
Function: bind/list lis transducer …
Function: bind/box box transducer …
Function: bind obj transducer …

[SRFI-210]{srfi.210} これらはモナドのbindです。最初の引数はデータのソースで、それぞれが多値へと展開されます (bind/listではリストlisの各要素が多値に、 bind/boxではボックスboxの各要素が多値に、 bindではobjが唯一の値になります)。 それが引数として最初のtransducerに渡されます。 その結果(複数かもしれない)が次のtransducerに渡されます。 そうしていって最後のtransducerの返す値(複数かもしれない)が全体の結果となります。 これらはcompose-leftを使って次のとおり書けます。

(bind/list lis proc ...)
  ≡ (apply (compose-left proc ...) lis)
(bind/box box proc ...)
  ≡ (apply/mv (compose-left proc ...) (unbox box))
(bind obj proc ...)
  ≡ ((compose-left proc ...) obj)


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