2013-07-02 84 views
2

此代碼的工作:Clojure的(範圍)和DEF -light表(迭代增量0)差

(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)) 
) 

怎麼會第二代碼是不允許的?

在第一代碼,(範圍)返回無限序列(0 ...)

在第二代碼

,(迭代增量0)也返回無限序列(0 ...)

什麼變得如此不同?

請指導。謝謝。

(編輯)

高興聽到碼#1和碼#1是等價的。

然而,在我的環境(光表)不能EVAL它:

enter image description here

+0

我認爲這是一個光照問題。你可以檢查它是否在純clojure repl? –

+0

是的,我同意。我在控制檯上嘗試了clj REPL模式,代碼#2不會產生錯誤。謝謝。 –

回答

3

沒有什麼不同。你的前兩個代碼片段都能正常工作:你一定很困惑並運行一些不同的程序。

編輯迴應澄清:

光表大概是試圖向你展示中間結果(iterate inc 0)以及最終結果。我猜想不同之處在於(lazy-seq? (range))返回true,並且(lazy-seq? (iterate inc 0))返回false(因爲第一個元素是渴望的,即使序列的其餘部分不是)。

這對我來說看起來像是一個非常嚴重的問題,但您對alpha質量軟件有什麼期望?無論如何,它根本不是一個clojure問題。

+0

謝謝,我認爲沒有什麼不同,但是,在我的環境中,我確信#2有錯誤。我編輯的問題,並添加截圖... –

+0

嗯,我知道它仍然是阿爾法,我的原始問題是確認代碼本身是否有任何問題。我認爲輕量表是在Clojure中開發的,主要語言是Clojure。我已經向他們的論壇報告了這個錯誤。謝謝。 –