gpt4 book ai didi

c# - 在(通过转换为状态机)递归生成器方法中摆脱 'yield' 的最简单方法?

转载 作者:行者123 更新时间:2023-11-30 12:48:58 26 4
gpt4 key购买 nike

我写了一段漂亮、优雅的 (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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com