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