我编写了一段漂亮、优雅 (IMO) 的代码,我想移植到其他语言,如 C++、Java 等。
我面临的问题是双重的:
- 代码使用
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();
}
}
}