clojure懒惰序列和letfn

时间:2013-12-30 10:22:42

标签: recursion clojure

我正在Clojure中尝试一些懒惰的流。 如果我这样做:

(defn ints-from [n]
   (cons n (lazy-seq (ints-from (inc n)))))

(def nats (ints-from 0))

没关系,我可以这样做:

(take 5 nats)

现在我试图将2个函数封装在1:

(defn natz[]
( letfn   [(aux [n]((cons n (lazy-seq (aux (inc n)))))) ] (aux 0) ))

这似乎是编译,但不符合我的期望。

(take 4 natz)

给出:

(user=> IllegalArgumentException Don't know how to create ISeq from: user$natz    
clojure.lang.RT.seqFrom (RT.java:494)

我错过了什么?

1 个答案:

答案 0 :(得分:5)

在letfn定义中较少的一个括号和一个用于调用natz函数的括号

(defn natz[]
  (letfn [(aux [n] (cons n (lazy-seq (aux (inc n)))))]
    (aux 0)))

使用示例:

(take 4 (natz))
=> (0 1 2 3)