gpt4 book ai didi

clojure - 延迟序列的分步示例

转载 作者:行者123 更新时间:2023-12-04 17:37:32 25 4
gpt4 key购买 nike

我很难理解懒惰工作以及缓存是如何工作的。

我认为在工作中使用惰性序列的分步示例在这里真的很有帮助。例如,我已经阅读了以下问题:

Clojure lazy sequence usage

但目前还不清楚。

我的问题是调用如何确定另一个调用是否与缓存调用“相等”以及它在缓存中保留多长时间?我试图(source lazy-seq)但显然它在Java领域,所以我在这里运气不好。

对于一个简单的惰性序列,只取一个参数(比如 2 的幂列表),如果我用 5 和 8 调用它会怎么样?是否只缓存了这两个值?

如果我要通过缓存我已经调用惰性函数的每个输入来破坏内存,那么创建和缓存无限列表以获得无限结构有什么意义?

因为它说它在每个后续调用中缓存结果......带有's'。

1: result for argument being '1' cached 2: result for argument being '2' cached 3: result for argument being '3' cached ... 230: I counted up to 230 and it's great because I'm lazy and all, but now there's a 2**30 cache in memory caching all the previous calls for all the subsequent calls.



还是只是缓存的最后一个调用?

如果我编写一个以树为参数的惰性函数怎么办?它运行等于吗?在传递的参数上知道是否需要进行新的评估?

可以在运行时以某种方式跟踪这种行为吗?

最佳答案

延迟序列中的“缓存”不是一个可变缓存,它会像您在 web 应用程序中使用的那样过期,它是一个大小为 1 的缓存,列表中的每个单元格中都有一个。那个“缓存”要么包含一个值,要么包含计算该值的代码,但永远不会同时包含两者。一旦它计算出值,它就会缓存该值(在该单元格/条目中),如果有人再次读取该单元格,它会直接为他们提供该值,而不是调用代码。

这是一个简化的假想 repl session 来说明这一点:

user> (def a (range))
a = [code-for-rest]
user> (first a)
a = [code-for-first, code-for-rest]
a = [0, code-for-rest]
result=> 0
user> (first a)
a = [0, code-for-rest]
result=> 0
user> (nth a 10)
a = [0]->[1]->[2]->[3]->[4]->[5]->[6]->[7]->[8]->[9, code-for-rest]
result=> 4

在这个例子中,每个单元格最初包含(这是为了说明这一点的简化)生成值的代码和生成列表其余部分的代码(如果这是列表的末尾,则为 nil)。一旦该单元被实现(变得非延迟),它就会用实际值替换它的内容,因此它现在包含该值和生成序列其余部分的代码。当读取列表中的下一个单元格时,它将首先由剩余代码(包含在单元格中)生成,然后新单元格中的第 n 个代码将生成该单元格的值。

关于clojure - 延迟序列的分步示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13733913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com