解決済み:次のような最小限のラッパーのみを必要とする、 setjmp()
/を使用したクリーンな方法を見つけました。longjmp()
int jump(jmp_buf j, int i) { longjmp(j, i); return 0; }
これによりjump()
、条件式で使用できます。だから今コード:
if (A == 0) return;
output << "Nonzero.\n";
正しく翻訳される:
return
((A == 0) && jump(caller, 1)),
(output << "Nonzero.\n"),
0;
呼び出し元の関数の呼び出しポイントに戻る場所caller
です。jmp_buf
例外よりも実装定義がはるかに少ない程度まで、クリーンでシンプルで効率的です。ご協力ありがとうございました!
式の途中でフロー制御構造の使用をエミュレートする方法はありますか? カンマ区切りの式x, y
で、 forが ?y
を引き起こす可能性はありreturn
ますか?
編集:私は関数型言語にかなり似たもののコンパイラに取り組んでおり、ターゲット言語は C++ です。すべてがソース言語の表現であり、宛先言語への最も健全で単純な翻訳は、可能な限り多くの表現を残します。基本的に、ターゲット言語のセミコロンは C++ コンマになります。言語内のフロー制御構造は、これまでのところ問題を示していません。それだけreturn
です。コンマで区切られた式を途中で終了する方法が必要なだけで、この状況で過度のオーバーヘッドがないことを誰かが私に示すことができない限り、例外を使用したくない.
もちろん問題は、ほとんどのフロー制御構造が C++ の正当な式ではないことです。これまでに見つけた唯一の解決策は、次のようなものです。
try {
return
x(), // x();
(1 ? throw Return(0) : 0); // return 0;
} catch (Return& ret) {
return ref.value;
}
return
ステートメントは常にそこにあり (Return
コンストラクトに到達しない場合)、式で結果が使用されていることをコンパイラーに黙らせるために、ステートメントthrow
をラップする必要があります。?:
void
この場合、特定のオーバーヘッドが発生しないことが示されない限り、フロー制御に例外を使用することは本当に避けたいと思います。例外をスローすると、巻き戻しや何かが発生しますか? このコードは、妥当な効率で実行する必要があります。に相当する関数レベルが必要なだけですexit()
。