问题:函数 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! 就足够了)。