SRFI 42中的急切理解可以有一个运行生成器的:while子句,例如:(list-ec (:while (:range i 10) (< (* i i) 50)) i)返回列表(0 1 2 3 4 5 6 7) (并在7处停止迭代,与if不同,比如在(list-ec (:range i 10) (if (< (* i i) 50)) i)中,它将继续运行,但不会产生更多的值)。
在Racket中,我通常更喜欢使用本地的for和for/list,但它们似乎没有这样的内置功能。在球拍的for中模拟for的最佳方法是什么?
发布于 2013-05-16 04:01:21
不知何故,我在文档中漏掉了它:答案是使用函数。您可以翻译如下:
(list-ec (:while (:integers i) (< (* i i) 10))
(:while (:integers j) (< (* (+ i 1) j) 10))
(list i j))至
(for*/list
([i (stop-before (in-naturals 0) (λ (i) (>= (* i i) 10)))]
[j (stop-before (in-naturals 0) (λ (j) (>= (* (+ i 1) j) 10)))])
(list i j))注意,我们需要星型版本for*/list,因为默认情况下,list-ec会生成嵌套循环。另外,正如Asumu所指出的,球拍在理解中有一个#:break子句,但它的工作方式不同:它不限制单个生成器,而是退出整个循环。
发布于 2013-05-15 21:45:37
您可以在#:break循环中使用for子句来做类似的事情。例如,下面是我认为等同于您的示例的内容:
(for/list ([i (in-range 0 10)]
#:break (> (* i i) 50))
i)这将在#:break条件保持时停止迭代。您还可以使用#:when来过滤迭代而不是停止。有关更多选项,请参见为文档。
https://stackoverflow.com/questions/16575110
复制相似问题