Loops 将迭代计算转换为迭代器——什么';这叫什么?
这一定是一个常见的代码转换,所以我很惊讶,我无法轻松找到它的名称,也无法找到如何最好地进行转换的信息 原始代码(伪): 是的,它通常被称为“惰性评估”(设计模式),但这种特定的、基本的代码转换类型不是被称为更具体的东西吗?我还查阅了“迭代器”和“工厂”设计模式,以及“循环展开”,但没有什么概念适合我所说的。有什么想法吗?我错过了什么?感谢您的指导 更新 答案是“生成器”,如下所示。至于代码的“转换”,上面的核心变化是Loops 将迭代计算转换为迭代器——什么';这叫什么?,loops,iterator,generator,lazy-evaluation,code-conversion,Loops,Iterator,Generator,Lazy Evaluation,Code Conversion,这一定是一个常见的代码转换,所以我很惊讶,我无法轻松找到它的名称,也无法找到如何最好地进行转换的信息 原始代码(伪): 是的,它通常被称为“惰性评估”(设计模式),但这种特定的、基本的代码转换类型不是被称为更具体的东西吗?我还查阅了“迭代器”和“工厂”设计模式,以及“循环展开”,但没有什么概念适合我所说的。有什么想法吗?我错过了什么?感谢您的指导 更新 答案是“生成器”,如下所示。至于代码的“转换”,上面的核心变化是a[n]=-->yield,当然,使用任何语法定义生成器而不是子例程。但是,如果
a[n]=
-->yield,当然,使用任何语法定义生成器而不是子例程。但是,如果您的语言不支持这个想法,或者您不想使用第三方软件包来实现它,也可以“手动”实现这个想法(至少在这个简单的情况下),方法是“取消测试”所有循环:
sub array_next {
if (++k >= p[i][j])
k = 0;
if (++j >= Y)
j = 0;
if (++i >= X)
return false
return calculation(i,j,k,p)
}
sub array_start {
i = j = k = 0;
}
注意一个需要正确处理的差异:变量(
i
,j
,k
)已经成为全局变量,或者至少是公开变量。这里所做的不完全是延迟求值,因为它通常指的是对某个表达式的延迟求值,这在函数式编程中很常见。摘自维基百科关于:
[…]惰性评估或按需调用是一种评估策略
延迟表达式的计算,直到需要其值[…]
您在这里构建的内容非常适合术语生成器。摘自维基百科关于:
[…]生成器是一种特殊的例程,可用于控制
循环的迭代行为。事实上,所有的发电机都是
迭代器。生成器非常类似于返回的函数
可以调用一个数组,其中生成器具有参数,并且
生成一系列值。但是,不是构建阵列
包含所有值并同时返回它们的生成器
一次生成一个值,这需要更少的内存并允许
调用方立即开始处理前几个值
如果生成的序列是无限的,则生成器通常被称为流。但是,术语流也用于按需计算的有限序列。枚举器?我认为(可能是错误的)MoveNext、MovePrev、Start、End属于枚举器样式/名称…谢谢。到目前为止,我只发现“enumerator”被描述为“iterator”的一个实现接口,并且总是绑定到现有的可枚举集合(而不是延迟计算的值),但可能还有更多…myeah这里没有真正的术语。。。你基本上只是在一个数组中循环,然后检查一个条件。。。没有什么特别或具体的。我以为你指的是你循环的方式(移动下一步而不是For循环)。。。对不起,我帮不了你更多;很抱歉,上面的func名称可能混淆了--转换后的实现中没有这样的“数组”。我们的想法是不计算任何这样的数组,只计算它的元素一个接一个(这样可以避免对可能永远不会使用的值进行昂贵的计算)。。。如果你知道那个词是什么,让我知道……是的,就是这个!作为一个纯粹主义者(以及为了我自己的教育和效率控制),我将在上面的代码中为自己实现这个概念,通过取消所有循环,而不是找到一个给我提供
收益
能力的包。但是很高兴知道,这个设计需求以前已经被识别、命名和解决了!
sub array_start() {...}
sub array_next() {... return val}
array_start();
while (m = array_next())
if some_cond(m) break;
work_with(m);
sub array_next {
if (++k >= p[i][j])
k = 0;
if (++j >= Y)
j = 0;
if (++i >= X)
return false
return calculation(i,j,k,p)
}
sub array_start {
i = j = k = 0;
}