问题标签 [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.
scheme - 生成素数时的“应用程序:不是程序”
我正在尝试输出前 100 个素数并不断收到错误消息:
申请:不是程序;期望一个可以应用于给定参数的过程:(#) arguments...: [none]
错误显示在我的 take$ 过程中:
这是我所有的代码:
感谢您的任何帮助,您可以提供。
stream - 交替两个值
我有代码
结果是 1,2,3.. 我怎么能把它改成 1,2,1,2,1,2..
我在 f 中尝试了 cons 但没有用。有任何想法吗?
stream - 流中的递归
我有代码
s 可能是类似权力的流
我的功能
给出'(2 4 8 16 32)。
现在,我想定义一个流(加十),它可以获取流的权力并提供另一个流。所以,如果我称之为
将给出'((10. 2) (10. 4) (10. 8) (10. 16) (10. 32))。
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。
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)))
问题是:它似乎并不懒惰......即使我没有消费它,它也会永远存在。有没有办法让它变得懒惰?
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 将返回尾部......现在我需要返回头部。
haskell - 从非 IO 列表创建惰性 IO 列表
我有一个由find创建的文件名的惰性列表。我也希望能够懒惰地加载这些文件的元数据。这意味着,如果 i元素来自,它应该只搜索这十个文件的元数据。如果您在不挂磁盘的情况下要求它们,事实就是完美地为您提供了 10 个文件,而我的脚本搜索所有文件的元数据。take 10
metadata
find
如您所见, loadMetaList不是惰性的。为了让它变得懒惰,它应该使用尾递归。类似的东西return (first:loadMetaList rest)
。
如何使loadMetaList 变得懒惰?
clojure - Clojure:调用包含的惯用方式?在惰性序列上
是否有一种惯用的方法来确定 LazySeq 是否包含元素?从 Clojure 1.5 开始,调用contains?
会引发 IllegalArgumentException:
据我所知,在 1.5 之前,它总是返回 false。
我知道调用contains?
LazySeq 可能永远不会返回,因为它可能是无限的。但是如果我知道它不是并且不在乎它是否被热切地评估呢?
我想出的是:
但感觉不太对劲。有没有更好的办法?
clojure - 如何正确使用 LazySeq
当我使用lazySeq 时有很多困惑。
问题:
收到错误消息:StackOverflowError clojure.lang.RT.more (RT.java:589)
以下解决方案效果很好:
都concat
和map
返回惰性序列,为什么上面的程序长得像但又区别开来?
更详细地说,为什么第一个示例(lazy-seq
包装concat
)失败但其下一个示例(lazy-seq
包装map
)成功?