我写了一段漂亮、优雅的 (IMO) 代码,我想移植到其他语言,如 C++、Java 等。
我面临的问题是双重的:
- 代码使用
yield
- 代码是高度递归的
手动摆脱 yield
是可能,但非常乏味 -- 这个过程非常机械,显然可以自动化。
同时,C# 编译器将其转换成的状态机非常难看 -- 它实际上无法用于移植。 (我试过反编译它;它只是不可读。)
我想知道,除了花几天时间手动摆脱 yield
之外,我还有其他选择吗?
或者是否有某种工具可以将 yield
block 转换为(可读)状态机,然后我可以像普通代码一样移植它?
如果您对我所说的“高度递归”是什么意思感到好奇——下面的代码基本上是代码的结构(实际只有 ~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();
}
}
}
最佳答案
yield 完成的工作接近协程。您应该能够移植到支持这些语言的语言。不幸的是,很少有语言这样做。我相信 Ada 拥有它们。
下一步是纤维。 Win32 API 公开纤程,因此对于 C++,这可能是一个选项。我认为不适用于 Java。
因此,简短的回答:调查您的目标平台的协程或纤程的可用性。
关于c# - 在(通过转换为状态机)递归生成器方法中摆脱 'yield' 的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13008295/