srfi.210
- 多値のための手続きと構文 ¶このモジュールは、複数の値を返す式を通常の単一の値を扱う式にうまく混ぜて使えるようにする マクロや手続きを提供します。
[SRFI-210]{srfi.210
}
(call-with-values (^[] producer) consumer)
の略記です。
[SRFI-210]{srfi.210
}
(with-values producer (case-lambda clause …))
の略記です。
[SRFI-210]{srfi.210
}
apply
と似ていますが、最後の引数producerは複数の値を返すことができ、
それがoperatorへの引数リストの末尾に付け加えられます。
つまり(apply operator operand … (values->list producer))
と同じです。
[SRFI-210]{srfi.210
}
producer …の各式が返す多値をリストにしてつなぎあわせたものを
引数リストにしてprocを呼び出します。
(call/mv list (values 1 2 3) (values 4 5 6)) ⇒ (1 2 3 4 5 6)
[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>
[SRFI-210]{srfi.210
}
(list-ref (list/mv element … producer) index)
と同じ値を返します。
element …が無い場合は、Gauche組み込みのvalues-ref
の
引数順をひっくり返したものになります(多値参照)。
[SRFI-210]{srfi.210
}
producerを評価し、結果の値の数を返します。
[SRFI-210]{srfi.210
}
producerを評価し、その結果の値(複数かもしれない)を引数として
最初のtransducerを呼びます。それが値(複数かもしれない)を返したらそれらを
引数として二番目のtransducerを呼び、以下同様にして最後のtransducerが
返す値(複数かもしれない)を返します。最後のtransducerは末尾呼び出しされます。
transducerが与えられなければ、producerの結果の値(複数かもしれない)が そのまま返されます。
[SRFI-210]{srfi.210
}
リストlis、ベクタvec、ボックスboxの中身を複数の値として返します。
box-values
はunbox
と同じですが、
名前付けの一貫性のために用意されています (ボックス参照)。
[SRFI-210]{srfi.210
}
obj …のindex番目の値を返します。
[SRFI-210]{srfi.210
}
values
と同じです。
Gaucheの組み込みのidentity
はこれと違い正確に一つの値だけを取ることに
注意してください (コンビネータ参照)。
[SRFI-210]{srfi.210
}
各transducerは手続きでなければなりません。
合成された手続きを返します。その手続きは、渡された引数をまず最初のtransducer
に渡し、その結果(複数かもしれない)を次のtransducerに渡し、ということを続けて
最後のtransducerの結果(複数かもしれない)を返します。
tranducerがひとつも渡されない場合はvalues
と同じです。
これはGauche組み込みのcompose
を使って次のように書けます(コンビネータ参照)。
(define (compose-left . procs) (apply compose (reverse procs)))
[SRFI-210]{srfi.210
}
各transducerは手続きでなければなりません。
合成された手続きを返します。その手続きは、渡された引数をまず最後のtransducer
に渡し、その結果(複数かもしれない)をひとつ前のtransducerに渡し、ということを続けて
最初のtransducerの結果(複数かもしれない)を返します。
tranducerがひとつも渡されない場合はvalues
と同じです。
これはGauche組み込みのcompose
と同じです(コンビネータ参照)。
[SRFI-210]{srfi.210
}
手続きを作って返します。その手続きは、任意個の引数を取り、それぞれにprocを適用して、
その結果を多値として返すものです。
procが一つ以外の値を返した場合の動作は未定義です。
((map-values (cut + <> 1)) 1 2 3) ⇒ 2, 3, 4
[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)