@@ -13,13 +13,13 @@ namespace std::execution {
1313* unspecified[italic]
1414
1515## 概要
16- `let_value`は、新しいSenderを返す関数呼び出し可能なオブジェクトに引き渡すことで、入力[Sender](sender.md)の[値完了](set_value.md)結果から子入れ子の非同期操作へと変換するSenderアダプタである 。
16+ `let_value`は、新しいSenderを返す関数呼び出し可能なオブジェクトに引き渡すことで、入力[Sender](sender.md)の[値完了](set_value.md)結果から入れ子の非同期操作へと変換するSenderアダプタである 。
1717
1818`let_value`はパイプライン記法をサポートする。
1919
2020
2121## 効果
22- 説明用の式`sndr`と`f`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは[`movable-value`](../movable-value.md)を満たさないとき、呼び出し式`let_value(sndr, f)`は不適格となる。
22+ 説明用の式`sndr`と`f`に対して、`decltype((sndr))`が[`sender`](sender.md)を満たさない、もしくは`decltype((f))`が [`movable-value`](../movable-value.md)を満たさないとき、呼び出し式`let_value(sndr, f)`は不適格となる。
2323
2424そうでなければ、呼び出し式`let_value(sndr, f)`は`sndr`が1回だけ評価されることを除いて、下記と等価。
2525
@@ -50,6 +50,14 @@ namespace std::execution {
5050
5151`impls-for<decayed-typeof<let_value>>::get-state`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
5252
53+ - `args_variant_t` : 入力Sender`sndr`の完了シグネチャ集合から求まる送信値リスト型情報(`variant<monostate, tuple<...>, ...>`)
54+ - `ops2_variant_t` : `f`が返すSenderに対応する非同期操作型情報(`variant<monostate, {OperationState型}, ...>`)
55+ - 戻り値`state-type`型オブジェクトを下記の通り初期化する。同オブジェクトは`complete`メンバから呼ばれる`let-bind`で利用される。
56+ - `fn` : Senderアルゴリズム構築時に指定した関数呼び出し可能オブジェクト`f`
57+ - `env` : 入力Sender`sndr`に関連付けられた[属性](../queryable.md)
58+ - `args` : `f`呼び出し時の引数リスト格納用変数(空値`monostate`で初期化)
59+ - `ops` : `f`が返すSenderに対応する非同期操作の格納用変数(空値`monostate`で初期化)
60+
5361```cpp
5462[]<class Sndr, class Rcvr>(Sndr&& sndr, Rcvr& rcvr) requires see below {
5563 auto& [_, fn, child] = sndr;
@@ -78,7 +86,7 @@ namespace std::execution {
7886 * variant[link /reference/variant/variant.md]
7987 * monostate[link /reference/variant/monostate.md]
8088
81- - 説明用の型`Tag`とパック`Args`に対して、説明用のエイリアステンプレート`as-sndr2<Tag(Args...)>`を`call-result-t<Fn,` [`decay_t `](/reference/type_traits/decay.md)`<Arg >&...>`と定義する。型`ops2_variant_t `は下記定義において重複削除した型となる。
89+ - 説明用の型`Tag`とパック`Args`に対して、説明用のエイリアステンプレート`as-sndr2<Tag(Args...)>`を`call-result-t<Fn,` [`decay_t `](/reference/type_traits/decay.md)`<Args >&...>`と定義する。型`ops2_variant_t `は下記定義において重複削除した型となる。
8290
8391 ```cpp
8492 variant<monostate, connect_result_t <as-sndr2<LetSigs>, receiver2<Rcvr, Env>>...>
@@ -91,6 +99,9 @@ namespace std::execution {
9199
92100`impls-for <decayed-typeof <let_value>>::complete`メンバは、下記ラムダ式と等価な関数呼び出し可能なオブジェクトで初期化される。
93101
102+ - [値完了](set_value.md)の場合、`let_value`Sender構築時の引数`f`に対して`f(args...)`を呼び出し、戻り値[Sender](sender.md)から入れ子非同期操作を開始する。同Senderの完了結果を接続先[Receiver](receiver.md)へ転送する。
103+ - それ以外の完了操作の場合、接続先[Receiver](receiver.md)の同種完了関数へ転送する。
104+
94105```cpp
95106[]<class Tag , class... Args>
96107 (auto, auto& state, auto& rcvr, Tag, Args&&... args) noexcept -> void {
@@ -117,14 +128,20 @@ namespace std::execution {
117128- [`MAKE-ENV`](MAKE-ENV.md.nolink)`(`[`get_domain`](get_domain.md)`,` [`get_domain`](get_domain.md)`(`[`get_env`](get_env.md)`(sndr)))`
118129- `(void(sndr),` [`env<>{}`](env.md)`)`
119130
131+ 説明専用の`let-bind`テンプレート関数を下記の通り定義する。
132+
133+ - 入力Senderの完了結果から引数リスト`state.args`を構築し、Senderアルゴリズム構築時に指定した関数呼び出し可能オブジェクト`state.fn`を呼び出す。
134+ - 上記呼び出しで`state.fn`から返された[Sender](sender.md)と、完了結果をSenderアルゴリズムの接続先[Receiver](receiver.md)`Rcvr`へ転送するヘルパ`receiver2`を[接続(connect)](connect.md)する。
135+ - 接続結果[Operation State](operation_state.md)を`state.op2`上に構築し、入れ子の非同期操作を[開始(start)](start.md)する。
136+
120137```cpp
121138namespace std::execution {
122139 template<class State, class Rcvr, class... Args>
123140 void let-bind(State& state, Rcvr& rcvr, Args&&... args); // exposition only
124141}
125142```
126143
127- 説明専用の ` let-bind ` テンプレート関数の効果は下記と等価。
144+ ` let-bind ` テンプレート関数の効果は下記と等価。
128145
129146``` cpp
130147using args_t = decayed-tuple<Args...>;
@@ -192,7 +209,6 @@ namespace std::execution {
192209Senderアルゴリズム構築時および[ Receiver] ( receiver.md ) 接続時に、関連付けられた実行ドメインに対して[ ` execution::transform_sender ` ] ( transform_sender.md ) 経由でSender変換が行われる。
193210[ デフォルト実行ドメイン] ( ../execution/default_domain.md ) では無変換。
194211
195-
196212説明用の式` out_sndr ` を` let_value(sndr, f) ` の戻り値[ Sender] ( sender.md ) とし、式` rcvr ` を式[ ` connect ` ] ( connect.md ) ` (out_sndr, rcvr) ` が適格となる[ Receiver] ( receiver.md ) とする。式[ ` connect ` ] ( connect.md ) ` (out_sndr, rcvr) ` は[ 開始(start)] ( start.md ) 時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。
197213
198214- 入力[ Sender] ( sender.md ) ` sndr ` の完了結果で[ ` set_value ` ] ( set_value.md ) が呼ばれるとき、` f ` を呼び出すこと。
@@ -324,13 +340,13 @@ int main()
324340 try {
325341 auto result = std::this_thread::sync_wait_with_variant(sndr);
326342 // result := optional<variant<tuple<>>>型
327- // エラー完了時は受信int値が例外として送出される
328343 if (!result) {
329344 // 停止完了時はstd::nulloptが返却される
330345 break;
331346 }
332347 // 値完了==空値のためアクセスすべきデータ無し
333348 } catch (int n) {
349+ // エラー完了時は受信int値が例外として送出される
334350 std::println ("catch {}", n);
335351 }
336352 }
0 commit comments