Clojure:何时使用memoize,何时使用delay/force?

Clojure:何时使用memoize,何时使用delay/force?,clojure,Clojure,我刚刚开始学习Clojure,并试图理解两种乍一看似乎完全相同的方法之间的区别 (def func0 (delay (do (println "did some work") 100))) so.core=> (force my-delay2) did some work 100 so.core=> (force my-delay2) 100 这两种方法都有某种功能记忆。我错过了什么 我已尝试在上找

我刚刚开始学习Clojure,并试图理解两种乍一看似乎完全相同的方法之间的区别

(def func0 (delay (do 
                    (println "did some work") 
                    100)))
so.core=> (force my-delay2)
did some work
100
so.core=> (force my-delay2)
100
这两种方法都有某种功能记忆。我错过了什么

我已尝试在上找到解释,但无法找到。

延迟保留一个结果,您必须进行删除才能获得结果。 memoize是一个未绑定的缓存,它根据 输入参数。例如

用户=>def myinc memoize fn[x]println x inc x '用户/我的公司 用户=>myinc 1 1. 2. 用户=>myinc 1 2. 在你的无参数例子中,唯一的区别是你可以使用 结果直接无需解释

延迟的经典用例是以后需要的东西,这将阻止 或延迟启动。或者,如果要隐藏顶级def,则 编译器,例如,它们有副作用

memoize是一种典型的缓存,如果计算是 代价很高,而且输入参数集也不太多。有 clojure verse中的其他缓存选项允许更好的 配置,例如,它们没有解除绑定。

延迟保存一个结果,您必须取消绑定才能获得结果。 memoize是一个未绑定的缓存,它根据 输入参数。例如

用户=>def myinc memoize fn[x]println x inc x '用户/我的公司 用户=>myinc 1 1. 2. 用户=>myinc 1 2. 在你的无参数例子中,唯一的区别是你可以使用 结果直接无需解释

延迟的经典用例是以后需要的东西,这将阻止 或延迟启动。或者,如果要隐藏顶级def,则 编译器,例如,它们有副作用

memoize是一种典型的缓存,如果计算是 代价很高,而且输入参数集也不太多。有 clojure verse中的其他缓存选项允许更好的 配置,例如,它们未解除绑定。

delay也会缓存不同于memoize的异常。delay也会缓存不同于memoize的异常。
(defn vanilla-func [] (println "did some work") 100)
(def func1 (memoize vanilla-func))
so.core=> (func1)
did some work
100
so.core=> (func1)
100