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

欢迎!请参阅 关于 页面了解有关此过程的更多信息。

–1
core.cache
关闭

前天被 README.md 中的示例误导了。

我做了以下等效操作
(w/lookup-or-miss C3 :b (constantly (do (Thread/sleep 1000) 42)))

而不是

(w/lookup-or-miss C3 :b (fn [& args] (do (Thread/sleep 1000) 42)))

结果是我所做的 IO 调用(代替 (Thread/sleep 1000))始终会被评估。这导致了一个“缓存”,它返回缓存的值,但始终会触发调用

已关闭,并在其中提到:问题已在评论中回答
背景

嗨 Sean,我想问问我是如何为 core.cache 提交一个问题。我希望为 README.md 提供以下修改。当然,我很希望听到任何修改的意见。 https://github.com/zackteo/core.cache/commit/e4600ca53a85b080bad55f1fe7576621e28a6fef

但在我尝试创建一个 PR 之后,我了解到我需要通过一个不同的流程?我之前已经签署了 CA 修改 Clojure 网站的某些部分,但仍能为此创建 PR。

我尝试登录https://clojure.atlassian.net/jira/software/c/projects/CCACHE/issues以创建一个问题,但认为我没有访问权限,这很合理。有没有合适的途径提出问题https://ask.clojure.org/index.php/contrib-libs,这样最终 someone 就会创建一个 JIRA 问题?

我是否按照这个链接https://clojure.org/community/contributing#_reporting_problems_and_requesting_enhancements?操作?

1 答案

0 投票

我不明白你的问题。lookup-or-miss接受一个一个参数的函数——键,在缓存不包含所需值时调用此函数。

你能提供一个具体的复现案例和您感知的 bug 的说明吗?根据你的例子,我没有看到问题所在。

哦,我想我明白了……这与 core.cache 没有关系,而是与您对 core/constantly 函数的理解有关:它在返回一个仅有一个参数的函数(返回预先计算的值)之前,始终评估其参数(因为它是函数)。

这就是 Clojure 的工作方式。
我与 Sean 讨论了我正在做什么工作

我在 let 绑定中有类似这样(其中 s3-path->file-size! 是一个网络调用)

```
(let [s3-size (w/lookup-or-miss cache file-path (constantly (s3-path->file-size! file-path))]
;; do stuff
)
```

我最终意识到的是,我会从缓存中获取文件路径的值,但是由于不断改进,我会无意中强制评估s3-path->file-size!
 .
我意识到这对我对评估机制的理解是一个误解。但是,我认为这可能是未来其他人也可能遇到的一个错误。
Sean回应说

(let [s3-size (w/lookup-or-miss cache file-path s3-path->file-size!)]
  ...)
这才是你想要的。你传递一个函数,如果缓存项需要计算,它将在键(file-path)上调用该函数。
Sean还针对cache/through-cache上的w/lookup-or-miss更新了文档,并显式地提供了一个部分示例。

https://github.com/clojure/core.cache/commit/803d1c0b060ac0ad14c0cae6e6bcefa8c907199b
...