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

欢迎!有关如何工作的更多信息,请参阅关于 页面。

+3
ClojureScript
重新发布

我偶然发现了这个问题

Clojure
(get {:x (reduced 10)} :x)
=> #object[clojure.lang.Reduced 0x28494b99 {:status :ready, :val 10}]

(get-in {:x (reduced 10)} [:x])
=> #object[clojure.lang.Reduced 0x28494b99 {:status :ready, :val 10}]

ClojureScript
(get {:x (reduced 10)} :x)
=> #object[cljs.core.Reduced];与 Clojure 相同的行为
(get-in {:x (reduced 10)} [:x])
=> 10

所以看起来 ClojureScript 中的 get-in 似乎是自动 deref reduced 值的?

1 答案

0

CLJS 中 get-in 的实现使用 reduce 作为默认情况,这意味着当在查找时找到 reduced 对象时,它会被 reduce 逻辑展开。如果这导致错误,则一个临时的解决方案是为 get-in 提供一个 not-found 值,这将使用与 Clojure 相同的逻辑。我想向 CLJS 团队提出一个相应的请求是合理的。


重新展示
不错,谢谢。
我想可能在其他上下文中也使用了reduce来处理数据。因此,可能无法确保`reduced`的值在函数调用中“存活”下来?
...