您应该为此使用缓存,例如 clojure.core.cache。
澄清一下评论:记忆有助于纯函数:如果你的函数在给定相同输入的情况下总是返回相同的输出,你可以在计算一次后存储它。
如果输出随时间变化,则需要进行失效。无效的记忆(以及其他一些问题,例如记忆的大小)称为“缓存”。
如果您使用记忆机制进行缓存,那么您实际上所做的就是在其上实现缓存。仅使用缓存库的工作量要少得多。
在这种情况下,您需要实现“午夜失效”之类的东西。有关如何执行此操作的指针,请参阅https://github.com/clojure/core.cache/wiki 。
编辑:它可能看起来有点像这样(未经测试,带上你自己的today
):
(defcache MidnightCache [cache dates]
CacheProtocol
(lookup [this key]
(lookup this key nil))
(lookup [this key not-found]
(if (has? this key)
(get cache key)
not-found))
(has? [this key]
(let [d (get dates key)]
(and d
(= d (today)))))
(hit [this key]
this)
(miss [this key new-value]
(MidnightCache. (assoc (dissoc cache key)
key new-value)
(assoc (dissoc dates key)
key (today))))
(evict [this key]
(MidnightCache. (dissoc cache key)
(dissoc dates key)))
(seed [this base]
(MidnightCache. base
(zipmap (keys base)
(iterate identity (today))))))