上の補足(05/02)
ひとつ気づいたことがあるので補足しておきたい.k.inaba 氏のアイデアは cointoss にしても either { ... } or { ... } 構文にしても,「どちらの文を実行しても構わない」という,どちらかと言えば「制御の流れ」に着目しているところがあるが,上の arbitrary() は「どちらの値をとっても構わない」という,どちらかと言えば「値」に着目しているところがある.なお,二項演算子 |?| は後者の立場に近いが,氏は cointoss に対する糖衣構文的に持ち出している点には注意すべきかもしれない.
たとえば,(あまり適切な例でないかもしれないが)以下のようなコードがあったとしよう.
void do_something(int n) { either { for(int i = 0; i <= n; i++) { ... } } or { while(n-- > 0) { ... } } }
これを cointoss に置き換えることは容易だが,arbitrary() で置き換えるには,それぞれのブロックについて中身の処理を実行して無意味な値を戻すような関数を用意するか,以下のような少々不自然なコードを書かなければならない.
void do_something(int n) { if(arbitrary(true, false)) { for(int i = 0; i < n; i++) { ... } } else { while(n-- > 0) { ... } } }
ただし,上記の例を見てわかるように,cointoss は arbitrary() から容易に実装できるし,また逆もしかりなので,おそらくは本質的な問題ではないだろうと思われる.