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,最终有人会在JIRA中创建问题吗?

我是不是遵循这个https://clojure.org/community/contributing#_reporting_problems_and_requesting_enhancements?

1 答案

0
by

我不明白你的问题。lookup-or-miss接受一个单参数函数——键——当缓存不包含请求的值时调用。

你能提供一个具体的重现案例以及你对认为的bug的描述吗?根据你的例子,我没有看出问题所在。

by
哦,我想我明白了……这与core.cache无关,而是与你对core.clessly函数的理解有关:它会始终评估其参数(因为它是一个函数),在返回一个带有一个参数的函数(返回预先计算出的值)之前。

这只是Clojure的工作方式。
by
我与Sean讨论了我正在工作的内容。

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

```
(let [s3-size (w/lookup-or-miss cache file-path (constantly (s3-path->file-size! file-path))]
;; 做一些事情
)
```

所以我意识到,我会从缓存中获取file-path的值,但由于constantly,我无意中迫使s3-path->file-size!求值。
 。
明白这只是一场误解,我在评估方面出现了错误。但这种误解可能是未来别人也会遇到的问题。
界面头像:头像 界面信息: by
Sean 回应说:

(let [s3-size (w/lookup-or-miss cache file-path s3-path->file-size!)]
  …)
这正是你想要的。你传递一个函数,当缓存条目需要计算时,它将在键(文件路径)上调用。
界面头像:头像 界面信息: by
Sean 还在文档中更新了一个具有 w/lookup-or-miss 的显式部分示例,以及 cache/through-cache 的示例。

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