2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面获取更多关于此工作方式的详细信息。

0
core.memoize

用法场景:我有一段工作非常好的代码

(require '[clojure.core.cache :as cache])
(require '[clojure.core.memoize :as memo])
(import 'clojure.core.memoize.PluggableMemoization)

(defn lru-ttl-cache [base threshold ttl]
  (-> base
      (cache/lru-cache-factory :threshold threshold)
      (cache/ttl-cache-factory :ttl ttl)))

(defn lru-ttl-memo
  ([f base threshold ttl]
   (memo/build-memoizer
      #(PluggableMemoization. %1 (lru-ttl-cache %4 %2 %3))
      f
      threshold
      ttl
      (@#'memo/derefable-seed base))))

但是它依赖于一个私有变量。这实际上应该是公开的,这样客户端就可以更轻松地提供他们自己的实现。

顺便说一句,出色的库。我喜欢在Clojure生态系统中工作。

1 答案

+1

编辑
 
最佳答案

JIRA问题已创建:https://clojure.atlassian.net/browse/CMEMOIZE-28

可能还有更好的方法来提供这种类型的扩展,因为缓存元素是derefable的事实是为了作为一个实现细节。

这可能是个好主意。我写了一个辅助函数来抽象细节

   (定义构建辅助函数 [cache-factory f base & args]
     (构建备忘录器
      #(PluggableMemoization. %1 (apply cache-factory %2 %3))
      f
      (derefable-seed base)
      args))

备忘录实现随后变为(除去文档)

   (定义 memo
     ([f] (memo f {}))
     ([f seed]
      (build-helper cache/basic-cache-factory f seed)))

我早期的 lru-ttl-memo 函数简化为

   (定义 lru-ttl-memo
     (partial memo/build-helper lru-ttl-cache))

无疑简化了许多,且与实施细节无关。

差异在 https://github.com/john-shaffer/core.memoize/commit/669febe3af7f325de43cab82ab7d09469fd148a1

我实在不清楚你通常如何运行测试。我不得不将代码符号链接到一个 leiningen 项目中,对其进行热补丁修改,并调用 clojure.test/run-tests。
通常使用 Maven 运行辅助项目:mvn test

我维护的所有辅助项目通常也支持 CLI/deps.edn,你可以使用以下命令运行测试:clojure -A:test:runner

可选地提供要使用的 Clojure 版本的别名:clojure -A:test:runner:1.8

build-memoizer 现在如此通用的原因是因为它需要能够支持任意缓存,这些缓存可以是任意顺序的任意参数(因此你的辅助器只能对某些缓存工作)。
在检查这个时,我意识到 PluggableMemoization 的 seed 函数中存在一个错误 https://clojure.atlassian.net/browse/CMEMOIZE-27
clojure.core.memoize 的 master 分支已经修复了这个问题:而不是将 derefable-seed 公开,我添加了一个新的缓存函数,该函数接受一个函数,一个缓存(不是一个缓存工厂)和一个可选的种子/基本哈希表。这使得创建自定义缓存的函数更容易,同时暴露了库内部结构较少。

我会很快发布具有此更新功能的新版本。



如果没有,能否用一种我能看到你认为API中缺少什么的方式来解释您试图解决的问题?
by
memo-swap! 与快照功能正常工作,但快照为缓存中的每个项目创建了新的映射,这为设置缓存中的特定值带来了太大的开销。我会为此创建一个新的帖子。我其他的使用理解了API后非常适应API。我确实希望有能够在不同参数下交换缓存的逻辑,快照非常适合这个。
...