c# – 最简单的方法来摆脱(通过转换为状态机)递归生成器方法中的
发布时间:2020-12-15 21:41:29 所属栏目:百科 来源:网络整理
导读:我有一个很好的,优雅的(IMO)代码我写的,我想移植到其他语言,如C,Java等. 我面临的问题是双重的: 代码使用yield 代码高度递归 手工去除产量是可能的,但非常繁琐 – 这个过程非常机械,显然是自动化的. 同时,C#编译器将其转换为的状态机非常难看 – 它实际上不
我有一个很好的,优雅的(IMO)代码我写的,我想移植到其他语言,如C,Java等.
我面临的问题是双重的: >代码使用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. 因此,简短的回答:调查目标平台的协同例程或光纤的可用性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |