我有一个函数,它需要两个输入,我想记住。函数的输出仅取决于第一个输入的值,第二个输入的值对结果没有功能影响(但它可能会影响完成所需的时间)。由于我不希望第二个参数影响记忆,因此我无法使用memoize
。是否有惯用的方法可以做到这一点,还是我必须自己实施备忘录?
答案 0 :(得分:2)
我建议使用缓存(例如clojure.core.cache)而不是函数memoization:
(defonce result-cache
(atom (cache/fifo-cache-factory {})))
(defn expensive-fun [n s]
(println "Sleeping" s)
(Thread/sleep s)
(* n n))
(defn cached-fun [n s]
(cache/lookup
(swap! result-cache
#(cache/through
(fn [k] (expensive-fun k s))
%
n))
n))
(cached-fun 111 500)
Sleeping 500
=> 12321
(cached-fun 111 600) ;; returns immediately regardless of 2nd arg
=> 12321
(cached-fun 123 600)
Sleeping 600
=> 15129
答案 1 :(得分:2)
memoize
不支持仅在某些args上进行缓存,但很容易自己制作:
(defn search* [a b]
(* a b))
(def search
(let [mem (atom {})]
(fn [a b]
(or (when-let [cached (get @mem a)]
(println "retrieved from cache")
cached)
(let [ret (search* a b)]
(println "storing in cache")
(swap! mem assoc a ret)
ret)))))
答案 2 :(得分:0)
您可以将函数包装到另一个函数中(使用一个参数),并使用第二个默认参数将其调用为函数。然后你可以记住新功能。
(defn foo
[param1]
(baz param1 default-value))