因为我有一个lazy-seq
来计算斐波纳契序列。
(def fibonacci
(lazy-cat [0 1] (map + fibonacci (rest fibonacci))))
=> #'user/fibonacci
(take 10 fibonacci)
=> (0 1 1 2 3 5 8 13 21 34)
但是当我试图把fibonacci
放到let
里
(let [fibonacci
(lazy-cat [0 1] (map + fibonacci (rest fibonacci)))]
(take 10 fibonacci))
CompilerException java.lang.RuntimeException: Unable to resolve symbol: fibonacci in this context, compiling:...
如何解决这个问题?
发布于 2015-09-09 08:48:12
与def
不同,x
与(let [x f] ...)
制造的f
的绑定在f
中不可见。更准确地说,绑定到x
是在评估f
之后完成的。为了具有递归定义,您需要使用letfn
,它用于定义函数。因此,您不能再将fibonacci
视为LazySeq
,但可以将其定义为返回LazySeq
的函数。
(letfn [(fibonacci []
(lazy-cat [0 1] (map + (fibonacci) (rest (fibonacci)))))]
(take 10 (fibonacci)))
发布于 2015-09-09 08:20:03
看起来,如果您希望该构造在let
中工作,那么您将无法编写这样的代码类型:
(defn override-variables [x]
(let [x (do-some-stuff-with x)]
(do-stuff x))
在这种情况下,用局部变量定义懒散序列的情况要频繁得多。
但是,如果用(fn fib-func [args] ...)
命名匿名函数,并根据函数而不是变量构造延迟-seq,则可以在它的体内调用匿名函数。
(let [fib ((fn rfib [a b]
(lazy-seq (cons a (rfib b (+ a b)))))
0 1)]
(take 10 fib))
https://stackoverflow.com/questions/32473476
复制相似问题