1

解決済み:次のような最小限のラッパーのみを必要とする、 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()

4

3 に答える 3

1

cfrontネイティブC++コンパイラがあったとしてもほとんどなかったため、C ++をCに変換した(当時はテンプレートや例外がなかった)80年代後半から90年代前半のプログラムであるを調査することをお勧めします。

インライン関数を処理する方法は、実行しようとしている方法と非常によく似ています。多くの3値(?:)演算子、コンマ、および括弧です。ただし、if / thenよりも複雑な制御フロー(aforまたはwhileloopなど)を使用したインライン関数を式に変換することはできず、その関数を非インラインとして実装する必要があります。

「コンマ区切りの式を途中で終了する」唯一の方法は、3項演算子と括弧を使用することです。例えば:

(
    first thing,
    second thing,
    test expression?
    (
        next thing if successful,
        another thing,
        return value
    )
    :( // How often can you use an emoticon as an operator, anyway?
        something to do if unsuccessful,
        more cleanup,
        return value
    )
)

コンパイラーが三元演算子のthen節とelse節を短絡しない場合は、運が悪いことになります。

于 2010-04-21T12:58:47.087 に答える
1

何のために?C++ は命令型言語です。表現があるのは表現だけです。すべてを式/関数として実行する場合は、関数型言語を使用してください。

于 2010-04-21T12:21:52.263 に答える
0

翻訳プロセスをどのように実行する必要があるかについて、機能仕様 (たとえば、事前条件と事後条件の観点から) を持っているだけのように感じます。C++ は宣言型言語ではなく、命令型言語であるため、コーディングを開始する前に、その変換プロセスの手続き型実装を自分で派生させる必要があります。そして、既に見てきたように、コンマを使用してすべての元の式を連結するほど単純ではありません。

あなたがやろうとしているのは、C++ コンパイラに作業を任せることです。C++ は宣言型言語ではないため、これは機能しません。そのコンパイラーは、仕様から意図したものを動的に解釈しようとはしません。そして、これが機能する場合、C++ は別の動的宣言型言語である必要があり、おそらく別の静的言語をターゲットにすることになります。

何が機能するかについてのヒント: すべての元の式を完全に (考えられる副作用を含めて) 分析してから、コードを出力します。式が複合 (サブ式がある) 場合は、より大きな式を分析するまで何も出力しないでください。

于 2010-04-21T13:05:48.490 に答える