一応いまのところこんな感じで書けるようになってる
やってることが非同期処理なので多少ややこしいのは本質的に仕方がない
int func_async( int n ){
 if( n == 0 ){ return 0; }

 a_wait() << [&]{ sleep( 10*1000 ); };
 //↑非同期で何か重たい処理
 //↑別スレッドに投げたのちyield_return;

 int resunt;
 a_sync() << [&]{ //コルーチン作成
  resunt = func_async( n - 1 ); //再起呼び出し
 };
 //throw nanika;
 //↑仮に誰かが例外を投げれば親子関係のあるすべてのコルーチンの処理が
 //↑キャンセルされて、どのコルーチンもbarrier以降は実行しない

 //barrier前なのでresultの値は不定
 barrier();
 //barrier後なのでresultの値が決まる
 return n + result;
}
int main(){
 a_sync() << [&]{ //コルーチン作成
  int result;
  a_sync() << [&]{ result = func_async( 10 ); }; //コルーチン作成
  barrier();
  printf( "%d\n", result );
 }
 message_loop();
 return 0;
}