问题:函数 A 被记忆化。函数 B(及其他事项)计算一个有效的函数 A 调用没有调用 A。我们希望在 B 中利用这种效果来进一步减少 A 的计算。如果我们期望 B 执行速度比 A 快,我们也希望在 A 调用者的地方等待相应的 B 执行。
B 中执行该操作的期望操作是
(spoof A args calc)
其中 calc 是一个不带参数的 fn,它产生一个等于 (apply A args) 的值。这使得调用者能够将恰好与 calc 预期执行速度更快的 A 保持工作量。
Spoof 返回 calc 返回的值,或者在缓存 hit 的情况下返回为 args 存储的值。也就是说,如果在调用 (spoof A args calc) 之前发生了 (A args) 的调用,calc 不会被调用。
在我们已经拥有 (A args) 的结果并且不希望被 (A args) 的并发调用阻塞的情况下,所需的操作是
(spoof-unsynchronized A args val)
它立即返回 val 并尽快更新 A 的缓存。由于异步欺骗是一个非常快速的运算,并且无论如何都可能与 (A args) 的调用发生竞争条件,所以不需要阻塞 (A args) 的调用。(因此,swap! 内部缓存状态就足够了)。