19
|
Vijay Mathew Chor-ming Lung · 技术社区 · 15 年前 |
![]() |
1
8
下面是C++中使用光纤模拟生成器的例子: Yield Return Iterator for Native C++ Using Fibers
还有
原始的
C例程
setjmp, longjmp
达到类似的效果。
|
![]() |
2
11
在Lisp/Scheme中,我根本不会使用收益率。 “yield”需要某种语言中的共同程序或延续功能。许多对yield的使用都可以用一种更简单的功能方式实现。 收益率基本上与著名的来自经营者有关。;-)在这里,根据执行上下文的不同,某个地方的调用可能导致其他某个例程中的不同位置。所以一个例程突然有多个入口点,它们的顺序是在运行时确定的。对于简单的使用,这可能是好的,但我认为对于更复杂的代码,关于代码的推理将变得更加困难。 以问题中链接的方案示例为例:
多次调用(step)会返回不同的值。 我将创建一个闭包:
这将上述函数分解为两个不同的东西:一个携带状态的变量和一个改变状态的简单函数。状态不再隐式编码到执行序列中。
对于产量的其他用途,我们可以想象类似的解决方案。 把它和 generators from the Common Lisp SERIES library :
如果我们从另一个答案来看这个python示例
我们可以看到它复制了控制结构。调用位置和生成器都使用A作为迭代控制结构。使用闭包,我们只需提供状态转换代码,就可以避免在生成器内部使用控制结构。 |
![]() |
3
3
在javascript 1.7+中,我通常只需要添加几个括号和括号。其他一切都差不多。Javascript1.7引入了pythonic生成器和迭代器。 生成器表达式:
发电机
列表/数组理解
|
![]() |
4
3
使用C++ Generators 简单距离发生器声明:
用途:
意志输出
|
![]() |
5
3
对于@dmitry_vk关于常见Lisp的回答,我将在Lisp中添加一点,实际上,并不真正需要生成器。它们的用例被闭包、特殊变量和宏的不同应用程序完全覆盖,而不需要学习新结构的额外概念开销。 有时甚至内置结构也能工作。让我们看一下python wiki中的示例:
使用
AS
让我们考虑另一个用例-在某个自定义树上迭代。假设树由
我们可以用一个非常小和简单的宏遍历任何树/子树。
(警告:为了更清楚起见,我没有使用
下面是它的用法示例-获取所有叶节点的列表:
这看起来和标准一样
总的来说,我还没有看到 实际的 在Lisp中无法以较不复杂的方式实现的生成器使用示例。 |
![]() |
6
1
Monads 可以用来表示生成器(即使语义略有不同)。 所以任何允许我们在特殊语法中定义一元操作的语言都可以在这里使用。
Ruby可以通过其内置的延续功能来模拟生成器。 |
![]() |
7
1
虽然普通的lisp没有本机的延续,但是允许使用cps转换器创建分隔的延续,比如 cl-cont . 因此,公共lisp中的生成器可以用与方案生成器几乎相同的方式编写。
顺便说一下,基于延续的生成器有一个特性是Python和C生成器所缺少的:
|
![]() |
8
1
红宝石: 发电机功能:
|
![]() |
9
1
一般来说
发电机。注意,它返回内部函数。
其用途:
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 3 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 3 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 3 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 3 月前 |