C ++、Javaなどの他の言語に移植したい、美しくエレガントな(IMO)コードを書いています。
私が直面している問題は2つあります。
- コードは使用します
yield
- コードは非常に再帰的です
手で取り除くことyield
は可能ですが、非常に面倒です。プロセスは非常に機械的で、明らかに自動化可能です。
同時に、C# コンパイラがこれを変換するステート マシンは非常に醜く、移植には実質的に使用できません。(逆コンパイルしてみましたが、読めません。)
手で取り除くためにこれに何日も費やす以外に、他に選択肢はありますyield
か?
または、ブロックを (読み取り可能な) ステート マシンに変換できる何らかのツールがありyield
、それを通常のコードのように移植できますか?
私が「高度に再帰的」とは何を意味するのか知りたい場合は、以下のコードは基本的にコードの構造です (実際は 66 行しかありません。それほど長い関数ではありません)。
static IEnumerable<ReturnType> MyRecursiveYielder(args)
{
if (blah1) yield return foo;
else if (blah2)
foreach (var foo1 in foo2.Blah())
foreach (var item in MyRecursiveYielder(moreArgs))
yield return item;
else
{
var state = new State();
foreach (var item in blah)
foreach (var item2 in MyRecursiveYielder(otherArgs))
foreach (var item3 in blah3)
{
foreach (var result in MyRecursiveYielder(yetMoreArgs)))
yield return result;
foobar1();
}
while (condition)
foreach (var foo in blah)
foreach (var result in MyRecursiveYielder(argh)))
{
if (condition2)
foreach (var result in MyRecursiveYielder(almostThere)))
yield return result;
foobar2();
}
}
}