问题标签 [lazy-sequences]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
491 浏览

scheme - 生成素数时的“应用程序:不是程序”

我正在尝试输出前 100 个素数并不断收到错误消息:

申请:不是程序;期望一个可以应用于给定参数的过程:(#) arguments...: [none]

错误显示在我的 take$ 过程中:

这是我所有的代码:

感谢您的任何帮助,您可以提供。

0 投票
3 回答
364 浏览

stream - 交替两个值

我有代码

结果是 1,2,3.. 我怎么能把它改成 1,2,1,2,1,2..

我在 f 中尝试了 cons 但没有用。有任何想法吗?

0 投票
1 回答
302 浏览

stream - 流中的递归

我有代码

s 可能是类似权力的流

我的功能

给出'(2 4 8 16 32)。

现在,我想定义一个流(加十),它可以获取流的权力并提供另一个流。所以,如果我称之为

将给出'((10. 2) (10. 4) (10. 8) (10. 16) (10. 32))。

0 投票
1 回答
1955 浏览

file-io - 为什么 line-seq 返回 clojure.lang.Cons 而不是 clojure.lang.LazySeq?

根据 line-seq ( http://clojuredocs.org/clojure_core/clojure.core/line-seq ) 的 ClojureDocs 条目和 Stack 问题的公认答案 ( In Clojure 1.3, How to read and write a file ),当传递 java.io.BufferedReader 时,line-seq 应该返回一个惰性序列。

但是,当我在 REPL 中对此进行测试时,该类型被列为 clojure.lang.Cons。请看下面的代码:

在惰性序列调用中结束 line-seq 调用会产生惰性序列,但根据文档,这不是必需的:无论如何,line-seq 都应该返回惰性序列。

注意:在 REPL(我正在使用 nrepl)内部,似乎惰性 seq 已完全实现,所以我认为这可能只是 REPL 的一个怪癖;但是,当我使用 Speclj 对其进行测试时,也存在同样的问题。另外,我不认为实现惰性序列与正在发生的事情有关。

编辑:所以我在mobyte的回答说缺点的尾部有一个惰性序列后去检查源代码......

对 cons 的调用可以解释为什么 line-seq 的返回值的类型是 clojure.lang.Cons。

0 投票
5 回答
2712 浏览

clojure - Clojure 2d 列表到哈希映射

我有一个这样的无限列表:
((1 1)(3 9)(5 17)...)
我想从中制作一个哈希图:
{:1 1 :3 9 :5 17 ... )

基本上“内部”列表的第一个元素是关键字,而第二个元素是值。我不确定在创建时是否更容易创建我使用的列表:

(迭代 (fn [[ab]] [(计算 a) (计算 b)]) [1 1])

(b) 的计算需要 (a),所以我相信在这一点上 (a) 不能是关键字……重点是可以很容易地访问给定 (a) 的值 (b)。

任何想法将不胜感激......

--EDIT--
好的,所以我想通了:

(def my-map (into {} (map #(hash-map (keyword (str (first %))) (first (rest %))) my-list)))

问题是:它似乎并不懒惰......即使我没有消费它,它也会永远存在。有没有办法让它变得懒惰?

0 投票
2 回答
364 浏览

matrix - smalltalk中的惰性列表s表达式矩阵

所以我在 smalltalk 中创建了一个名为 LazyMatrix 的类。该类只有 1 个实例变量,不能是除 Object 之外的任何子类。LazyMatrix 的实例变量称为block,必须是back。我像这样初始化 LazyMatrix:

将有一种设置值的方法

此方法将通过将新块设置为 [#(ij value).[nil]] 来重新定义块。每个后续调用都会将一个 3 的数组添加到块中,因此它的扩展类似于 [#(ij value).[#(ij value).[nil]]],很像 s 表达式或“惰性列表”。

所以我需要访问这个块的头部(即 [#(ij value) )以及这个块的尾部(即 [#(ij value).[nil]] )。我如何在 smalltalk 中做到这一点?我知道在块上调用 value 将返回尾部......现在我需要返回头部。

0 投票
2 回答
399 浏览

haskell - 从非 IO 列表创建惰性 IO 列表

我有一个由find创建的文件名的惰性列表。我也希望能够懒惰地加载这些文件的元数据。这意味着,如果 i元素来自,它应该只搜索这十个文件的元数据。如果您在不挂磁盘的情况下要求它们,事实就是完美地为您提供了 10 个文件,而我的脚本搜索所有文件的元数据。take 10metadatafind

如您所见, loadMetaList不是惰性的。为了让它变得懒惰,它应该使用尾递归。类似的东西return (first:loadMetaList rest)

如何使loadMetaList 变得懒惰

0 投票
2 回答
1708 浏览

clojure - 如何提高 Clojure 中的文本处理性能?

我正在用 Clojure 编写一个简单的桌面搜索引擎,作为了解该语言更多信息的一种方式。到目前为止,我的程序在文本处理阶段的性能真的很差。

在文本处理期间,我必须:

  • 清理不需要的字符;
  • 将字符串转换为小写;
  • 拆分文档以获取单词列表;
  • 构建一个地图,将每个单词与其在文档中的出现关联起来。

这是代码:

由于我在 Haskell 中有此问题的另一个实现,因此我比较了两者,如您在以下输出中所见。

Clojure 版本:

哈斯克尔版本:

我认为 Clojure 实现中的(字符串->惰性序列)转换正在扼杀性能。我该如何改进它?

PS:这些测试中用到的所有代码和数据都可以在这里下载。

0 投票
2 回答
5929 浏览

clojure - Clojure:调用包含的惯用方式?在惰性序列上

是否有一种惯用的方法来确定 LazySeq 是否包含元素?从 Clojure 1.5 开始,调用contains?会引发 IllegalArgumentException:

据我所知,在 1.5 之前,它总是返回 false。

我知道调用contains?LazySeq 可能永远不会返回,因为它可能是无限的。但是如果我知道它不是并且不在乎它是否被热切地评估呢?

我想出的是:

但感觉不太对劲。有没有更好的办法?

0 投票
1 回答
271 浏览

clojure - 如何正确使用 LazySeq

当我使用lazySeq 时有很多困惑。

问题:

收到错误消息:StackOverflowError clojure.lang.RT.more (RT.java:589)

以下解决方案效果很好:

concatmap返回惰性序列,为什么上面的程序长得像但又区别开来?

更详细地说,为什么第一个示例(lazy-seq包装concat)失败但其下一个示例(lazy-seq包装map)成功?