问题:函数 A 被记忆化。函数 B(以及其他一些功能)在从未调用 A 的情况下就已经计算出 A 的有效函数调用。我们想在 B 中使用这种效果以进一步减少 A 的计算。如果我们预计 B 的执行速度比 A 快,我们也想让 A 的调用者等待 B 的对应操作在执行。
在 B 中实现这一期望操作的示例
(spoof A args calc)
其中 calc 是零个参数的 fn,生成的值等于 (apply A args)。这允许调用者正好将预期的计算工作量放入 calc,指望其比 A 执行得更快。
Spoof 返回 calc 返回的值,或者在没有缓存命中时返回为该 args缓存的值。也就是说,如果在调用 (spoof A args calc) 之前发生了调用 (A args),则不会调用 calc。
对于我们已经得到 (A args) 的结果且不想被 (A args) 的并发调用阻塞的情况,期望操作如下
(spoof-unsynchronized A args val)
它立即返回 val,然后在不久之后更新 A 的缓存。由于非同步欺骗是一个非常快的操作,它无论如何都受制于与 (A args) 调用的竞争条件,因此不必阻塞 (A args) 的调用。(所以只需要对内部缓存状态进行 swap! 就可以了)。