2024 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于 页面以获取更多有关如何使用本站的信息。

+2
序列
重新标记

sequence 的文档字符串说明

  • "... 不会强制一个惰性序列..."
  • "... 返回一个惰性序列..."

根据这些说明,我本以为 sequence (单独使用)不会导致其任何输入被消耗。不确定这是否是期望的行为,但或许措辞可以稍作调整以表明 sequence 会部分实现其输入。

(do
  (->> (range 1000)
       (map #(doto % prn))
       (sequence (map inc)))
  nil)

将以下内容打印到标准输出

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

这是与像 mapfilter 这样的惰性序列函数以及像 eduction 这样的延迟选项相反。以下表达式不会打印任何内容到标准输出

(do
  (->> (range 1000)
       (map #(doto % prn))
       (eduction (map inc)))
  nil)

(do
  (->> (range 1000)
       (map #(doto % prn))
       (map inc))
  nil)

另一个参考资料也似乎表明 sequence (单独使用)不会消耗任何输入,https://clojure.org/reference/transducers#_sequence

生成的序列元素是逐步计算得到的。这些
序列将按需逐步消耗输入并完全实现
中间操作。这种行为与惰性序列上的等效操作不同。
(着重号为我所加)

noting

由于 sequence 可以分块,因此这并不令人惊奇,但让我惊奇的是,sequence 将在没有返回结果额外调用的情况下部分实现其输入。

2 个答案

+2

选中
 
最佳答案

使用序列的转接阶数时,它会在 N 个源上创建一个转接迭代器(序列是唯一可以接触到的函数)。然后通过 RT.chunkIteratorSeq() 包装成 seq,这是确定是否需要返回 nil 或序列的方法。

没有回顾旧笔记,我不记得这是否是我们考虑过认为不重要的事情,或者这是疏忽但仍需纠正的事情。我同意您的观点,这种行为似乎与文档字符串冲突。

可能已经有与此相关的工单,但我还没有查看。

+2
...