gpt4 book ai didi

Clojure: defRecord, defProtocol: 只做一次昂贵的计算

转载 作者:行者123 更新时间:2023-12-04 20:17:15 27 4
gpt4 key购买 nike

语境

考虑下面的一段代码

(defprotocol ICat "Foo"
(meow [cat]))

(defrecord Cat [a b] "Cat"
ICat
(meow [cat] (some-expensive-operation a b)))



有什么办法可以让我在某个地方扔东西吗?

我希望(一些昂贵的操作 a b)在我执行时只评估一次
(->Cat a b)

这样在 (meow cat) 时,它只返回预先缓存的值,而不是即时重新计算它。例如:
[1] (let [x (->Cat a b)]
[2] (meow x)
[3] (meow x)
[4] (meow x))

我希望(一些昂贵的操作)在 [1] 处只计算一次,然后对于 [2]、[3]、[4] 它只返回旧值。

最佳答案

我建议包装逻辑以在构造函数中调用一次昂贵的操作,并将结果作为常规值存储在记录中:

(defprotocol ICat "Foo"
(meow [cat]))

(defrecord Cat [a b] "Cat"
ICat
(meow [cat] (:meow cat)))

(defn make-cat [a b]
(assoc (->Cat a b) :meow (some-expensive-operation a b)))

当您的代码变得更加复杂时,我发现您通常希望在任何情况下都定义自己的构造函数。

请注意,您可能还想考虑将昂贵的操作包装在惰性序列或延迟中,以便仅在需要时才进行计算。

关于Clojure: defRecord, defProtocol: 只做一次昂贵的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777908/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com