goto ですべてを作成するのは簡単ですが (f.ex. IL で証明されているように)、 Java でサポートされているすべてのものを使用して、高レベルの式とステートメントを含むすべてのgoto ステートメントを削除することも可能かどうか疑問に思っていました。
または、必要に応じて: 私が探しているのは、goto の作成方法に関係なく、常に機能する「書き換えルール」です。
それは主に理論的な質問として、純粋に興味として意図されています。良い/悪い習慣としてではありません。
私が考えた明らかな解決策は、次のようなものを使用することです。
while (true)
{
switch (state) {
case [label]: // here's where all your goto's will be
state = [label];
continue;
default:
// here's the rest of the program.
}
}
これはおそらく機能し、私の「正式な」質問には合っていますが、私の解決策は少し好きではありません。1つには、それは非常に醜く、2つには、基本的にgotoを、gotoとまったく同じことを行うスイッチにラップします。
それで、より良い解決策はありますか?
更新 1
多くの人が質問が「広すぎる」と考えているように見えるので、もう少し詳しく説明します... 私が Java に言及した理由は、Java には「goto」ステートメントがないためです。私の趣味のプロジェクトの 1 つとして、私は C# コードを Java に変換しようとしていましたが、これは非常に困難であることがわかっています (Java のこの制限が原因の 1 つです)。
それは私に考えさせました。あなたがf.exを持っている場合 Open addressing での「remove」メソッドの実装 ( http://en.wikipedia.org/wiki/Open_addressing - 注 1 を参照)。例外的な場合に「goto」があると非常に便利ですが、この特定のケースでは「状態」変数を導入することで書き直すことができます。これは 1 つの例にすぎないことに注意してください。継続用のコード ジェネレーターを実装しました。これらのコード ジェネレーターは、逆コンパイルしようとすると大量の goto を生成します。
また、この問題の書き直しが常に「goto」ステートメントを排除するかどうか、およびすべての場合に許可されるかどうかもわかりません。私は正式な「証拠」を探しているわけではありませんが、この問題で排除が可能であるといういくつかの証拠は素晴らしいでしょう.
したがって、「広さ」については、「答えが多すぎる」または「goto を書き直す方法がたくさんある」と考えるすべての人々に、アルゴリズムまたは一般的なケースを書き直すためのアプローチを提供してください。これまでは私が投稿したものです。