2

此代码有效:

(def n1 (range))
(println 
     (->> n1
          (take 30))
)

此代码不起作用:

(def n2 (iterate inc 0))
(println 
     (->> n2
          (take 20))
)

修改后的代码(n2 是函数)有效:

(def n2 #(iterate inc 0))
(println 
     (->> (n2)
          (take 20))
)

为什么不允许第二个代码?

在第一个代码中, (range) 返回无限序列 (0...)

在第二个代码中, (iterate inc 0) 也返回无限序列 (0...)

是什么让如此不同?

请指导。谢谢。

(编辑)

很高兴听到 code#1 和 code#1 是等效的。

但是,在我的环境(灯桌)中无法评估它:

在此处输入图像描述

4

2 回答 2

3

没有什么不同。您的前两个片段都可以正常工作:您一定感到困惑并运行了一些不同的程序。

编辑以回应澄清:

Light table 可能试图向您显示中间结果(iterate inc 0)以及最终结果。我猜想区别在于(lazy-seq? (range))返回 true 和(lazy-seq? (iterate inc 0))返回 false (因为第一个元素是渴望的,即使序列的其余部分不是)。

对我来说,这似乎是一个非常严重的灯桌问题,但你能从 alpha 质量的软件中得到什么?无论如何,这根本不是 clojure 问题。

于 2013-07-02T09:32:29.317 回答
1

LightTable 开发人员 Chris Granger 添加了一个问题:

https://github.com/Kodowa/Light-Table-Playground/issues/657

谢谢。

于 2013-07-03T22:59:28.253 回答