加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:41:29 所属栏目:百科 来源:网络整理
导读:我有一个很好的,优雅的(IMO)代码我写的,我想移植到其他语言,如C,Java等. 我面临的问题是双重的: 代码使用yield 代码高度递归 手工去除产量是可能的,但非常繁琐 – 这个过程非常机械,显然是自动化的. 同时,C#编译器将其转换为的状态机非常难看 – 它实际上不
我有一个很好的,优雅的(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.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读