在 Clojure 中,如何编写自己的递归函数来处理惰性列表?
In Clojure, how can I write my own recursive function to work with lazy lists?
我只是想向某人展示懒惰,我写了一个简单的递归函数来处理列表。
我假设它在无限列表上没问题。但是突然我得到一个 "too much recursion" 内部错误。
嗯?我总是编写执行此类操作的代码。有什么问题?
但是,当然,通常我使用像 map
这样的内置函数作为其他列表处理函数的基础。这次我尝试写自己的递归遍历。当然,这不可能行得通。
这是我写的。
(defn q [xs]
(if (empty? xs) ()
(cons (* (first xs) (first xs)) (q (rest xs)) )))
(take 10 (q (cycle '(1 2 3 4))))
那么,实际上我该如何编写自己的遍历函数来处理 Clojure 中的惰性数据结构?有某种等同于 "yield" 的东西吗?
(defn q [xs]
(if (empty? xs) ()
(lazy-seq ;; <- here's our magic!
(cons (* (first xs) (first xs)) (q (rest xs)) ))))
(take 10 (q (cycle '(1 2 3 4))))
我只是想向某人展示懒惰,我写了一个简单的递归函数来处理列表。
我假设它在无限列表上没问题。但是突然我得到一个 "too much recursion" 内部错误。
嗯?我总是编写执行此类操作的代码。有什么问题?
但是,当然,通常我使用像 map
这样的内置函数作为其他列表处理函数的基础。这次我尝试写自己的递归遍历。当然,这不可能行得通。
这是我写的。
(defn q [xs]
(if (empty? xs) ()
(cons (* (first xs) (first xs)) (q (rest xs)) )))
(take 10 (q (cycle '(1 2 3 4))))
那么,实际上我该如何编写自己的遍历函数来处理 Clojure 中的惰性数据结构?有某种等同于 "yield" 的东西吗?
(defn q [xs]
(if (empty? xs) ()
(lazy-seq ;; <- here's our magic!
(cons (* (first xs) (first xs)) (q (rest xs)) ))))
(take 10 (q (cycle '(1 2 3 4))))