C++にdo記法入れる話

本の虫: 2014-05-pre-Rapperswil mailingのレビュー
N4015でHaskellのdo記法風っぽいdo式を入れる提案があるわけなのだけれども、そもそも手続き型の記法でプログラミングができるC++の上にさらにモナドを使って手続き型風記法でプログラミングするためのdo式を導入するというのは、屋上屋を重ねるという気がしてしまう。もちろんdo式を導入すれば、手続きをより一般化したプログラマブルセミコロンたるモナドを使ったプログラミングがC++でもできるぞってのは無意味ではないのだが、いかにもHaskellのやり方をそのままC++に持ってきましたっていう感じで、C++の既存の手続きと一緒に使える方法で入れないと旨味がないのではないか。

そのdo式というのはこんな感じだ。

expected<error_condition, int> f2(int i, int j, int k)
{
  return (
    auto s1 <- safe_divide(i, k) :
    auto s2 <- safe_divide(j, k) :
    s1 + s2
  );
}

で、do式の形で書けるのはよいのだけれども、文の形でも書けたほうがC++の既存の手続きと親和性が高そうにみえる。

expected<error_condition, int> f2(int i, int j, int k)
{
  auto s1 <- safe_divide(i, k);
  auto s2 <- safe_divide(j, k);
  return s1 + s2;
}

この記法だと、他の制御構文も混ぜられそうに見える。

expected<error_condition, int> f3(int i, int j)
{
  a: auto k = get_value(); // どこかから値を取ってくるつもり
  auto s1 <- safe_divide(i, k);
  auto s2 <- safe_divide(j, k);
  if (s1 + s2 > 10) goto a;
  return s1 + s2;
}

これって実装可能なんですかね? 単純なbindだけじゃ無理で、まあF#のComputation式みたいなことになるんじゃないのか。

do式があってもいいけど、do式入れるんなら先にlet式入れてほしい、こんな感じの。

int f4(int i, int j, int k)
{
  return (
    auto s1 = safe_divide(i, k) :
    auto s2 = safe_divide(j, k) :
    (s1 && s2) ? *s1 + *s2 : 0
  );
}