我寫道:Lazyness和計算器
(fn r [f xs]
(lazy-seq
(if (empty? xs)
'()
(cons (f (first xs)) (r f (rest xs))))))
解決4clojure.com的問題#118:http://www.4clojure.com/problem/118
它要求重新實現地圖而不使用地圖等和溶液流測試(我不知道它是否正確:與其他解決方案非常接近)。
因爲這個問題指出,它必須是我懶的懶-SEQ寫了上面的代碼通過「包裝」我的解決辦法......但是我不知道如何懶惰序列作品。
我不明白什麼是「懶惰」在這裏,也不知道我如何測試它。
當我問(type ...)
我得到的,勿庸置疑,一個clojure.lang.LazySeq,但我不知道那是什麼,什麼我得到的,如果我只是刪除懶序列「包裝」之間的區別。
現在當然,如果我刪除的懶惰序列我得到一個計算器,爲什麼試圖執行此:
(= [(int 1e6) (int (inc 1e6))]
(->> (... inc (range))
(drop (dec 1e6))
(take 2)))
否則(即:如果我讓到位懶-seq的包裝),它似乎工作正常。
所以我決定嘗試以某種方式「調試」/跟蹤正在發生的事情,試圖瞭解它是如何工作的。我把下面的宏(我發現SO IIRC):
(defmacro dbg [x] `(let [x# ~x] (println "dbg: " '~x "=" x#) x#))
包裹內DBG宏工作版本,並試圖再次執行。現在kaboom:現在工作正常的版本現在也拋出了一個stackoverflow。
現在我不確定:也許這是宏的不利影響,它會以某種方式強制對否則不會被評估的東西進行評估?
這將是巨大的,如果任何人都可以解釋,用這個簡單的功能和簡單的測試,lazyness沒有怎麼在這裏工作,究竟是什麼被調用的時候,等
Clojure有'實現?'測試函數來測試是否已實現惰性序列的值。例如(實現?(範圍))將是錯誤的。 – NielsK