環境
次のコードを検討してください
(defprotocol ICat "Foo"
(meow [cat]))
(defrecord Cat [a b] "Cat"
ICat
(meow [cat] (some-expensive-operation a b)))
質問
どこかに let を投げる方法はありますか?
(some-expensive-operation ab) は、実行時に一度だけ評価されることをお勧めします
(->Cat a b)
そのため、(meow cat) の時点で、その場で再計算するのではなく、事前にキャッシュされた値を返すだけです。たとえば、次のようになります。
[1] (let [x (->Cat a b)]
[2] (meow x)
[3] (meow x)
[4] (meow x))
(some-expensive-operation) を [1] で正確に 1 回評価してから、[2]、[3]、[4] に対しては古い値を返すだけです。