微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个很好的,优雅的(IMO)代码我写的,我想移植到其他语言,如C,Java等.

我面临的问题是双重的:

>代码使用yield
>代码高度递归

手工去除产量是可能的,但非常繁琐 – 这个过程非常机械,显然是自动化的.
同时,C#编译器将其转换为的状态机非常难看 – 它实际上不能用于移植. (我试过反编译它;它只是不可读.)

我想知道,我还有其他选择,而不仅仅花费几天时间来手动摆脱收益吗?
或者是否有某种工具可以将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();
                }
    }
}

解决方法

产量达到的程度接近于惯例.您应该能够移植到支持这些语言的语言.不幸的是,语言很少.我相信阿达有他们.

下一步是纤维. Win32 API公开了光纤,因此C可以是一个选项.我认为不是Java.

因此,简短的回答:调查目标平台的协同例程或光纤的可用性.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐