首页 > 解决方案 > Clojure:何时使用 memoize 以及何时使用延迟/强制?

问题描述

我刚刚开始学习 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
(defn vanilla-func [] (println "did some work") 100)
(def func1 (memoize vanilla-func))
so.core=> (func1)
did some work
100
so.core=> (func1)
100

两种方法都进行某种功能记忆。我错过了什么?

我试图在https://clojuredocs.org/clojure.core/delayhttps://clojuredocs.org/clojure.core/memoize上找到解释,但找不到。

标签: clojure

解决方案


delay持有一个结果,你必须deref得到结果。 memoize是一个未绑定的缓存,它根据 输入参数缓存结果。例如

user=> (def myinc (memoize (fn [x] (println x) (inc x))))
#'user/myinc
user=> (myinc 1)
1
2
user=> (myinc 1)
2

在您的(无参数)示例中,唯一的区别是您可以直接使用结果(deref不需要)

经典用例delay是稍后需要的东西,这会阻止或延迟启动。或者,如果您想从编译器中“隐藏”顶级defs(例如,它们会产生副作用)。

memoize是一个经典的缓存,如果计算成本很高且输入参数集不过多,则最好使用它。clojure-verse 中还有其他缓存选项,允许更好的配置(例如,它们不是未绑定的)。


推荐阅读