首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相当于SRFI 42:在球拍的理解中

相当于SRFI 42:在球拍的理解中
EN

Stack Overflow用户
提问于 2013-05-15 21:16:10
回答 2查看 186关注 0票数 0

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中,我通常更喜欢使用本地的forfor/list,但它们似乎没有这样的内置功能。在球拍的for中模拟for的最佳方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-16 04:01:21

不知何故,我在文档中漏掉了它:答案是使用函数。您可以翻译如下:

代码语言:javascript
复制
(list-ec (:while (:integers i) (< (* i i) 10))
         (:while (:integers j) (< (* (+ i 1) j) 10))
       (list i j))

代码语言:javascript
复制
(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子句,但它的工作方式不同:它不限制单个生成器,而是退出整个循环。

票数 3
EN

Stack Overflow用户

发布于 2013-05-15 21:45:37

您可以在#:break循环中使用for子句来做类似的事情。例如,下面是我认为等同于您的示例的内容:

代码语言:javascript
复制
(for/list ([i (in-range 0 10)]
           #:break (> (* i i) 50))
     i)

这将在#:break条件保持时停止迭代。您还可以使用#:when来过滤迭代而不是停止。有关更多选项,请参见文档。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16575110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档