首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在clojure中使用lazy-seq有什么意义?

在clojure中使用lazy-seq有什么意义?
EN

Stack Overflow用户
提问于 2010-05-31 23:59:48
回答 2查看 2K关注 0票数 17

我正在看一些Fibonacci序列clojure代码的例子:

 (def fibs (lazy-cat [1 2] (map + fibs (rest fibs))))

我大体上理解这是怎么回事,但不明白lazy-cat的意思。我知道lazy-cat是一个宏,它被转换成这样的东西:

(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs))))) 

lazy-seq到底完成了什么?即使没有lazy-seq,它仍然会被懒惰地评估?这是严格出于缓存目的吗?

编辑:感谢您的回答。我的困惑是,它与来自REPL的普通concat一起工作,因为我之前在作用域中绑定了fibs。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-01 01:07:14

[1 2]上的lazy-seq是不需要的,但并不是很糟糕。

(map + fibs (rest fibs))上的lazy-seq是必不可少的;如果没有它,函数调用将在fibs绑定到值之前进行计算,这将导致异常。通过将其包装在lazy-seq中,调用将被延迟,直到需要该值,此时fibs将具有一个值。

票数 16
EN

Stack Overflow用户

发布于 2010-06-01 01:03:15

根据我的理解(我承认我仍然是Clojure的新手!),如果您尝试以下操作:

(def fibs (concat [1 2] (map + fibs (rest fibs))))

那么它就不能工作了,因为fibs还没有被绑定,因此后面对它的两次引用都失败了。

但是,您给出的延迟版本将会起作用,因为对fibs的引用仅在稍后使用序列时才会被实际解析--此时fibs已经被成功定义为lazy序列。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2944650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档