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)))

结果是,我做的I/O调用,它应该替代(code>(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

我不理解你的问题。《lookup-or-miss》接受一个接收一个参数的函数——键——当缓存不包含请求的值时将调用该函数。

你能提供一个具体的复制案例以及你对 perceived 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))]
;;做些事情
)
```

因此,我最终意识到我会从缓存中获取file-path的值,但由于constantly,我无意中强制执行了s3-path->file-size!
 
了解这一误解是我对评估流程理解不当。但假设这可能是在未来他人也可能遇到的一个错误。
Sean回应了

(let [s3-size (w/lookup-or-miss cache file-path s3-path->file-size!)]
  ...)
这正是你所需要的。你传递一个函数,如果缓存条目需要计算,它将在键(file-path)上调用该函数。
Sean还更新了文档,增加了一个带有w/lookup-or-miss的明确的部分示例,基于cache/through-cache的示例

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