问题:函数 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 的缓存内容。换句话说,如果之前已经调用过 (A args),那么在调用 (spoof A args calc) 之前不会调用 calc。
在已经得到 (A args) 的结果,并且不想被 (A args) 的并发调用阻塞的情况下,期望的操作是
(spoof-unsynchronized A args val)
它会立即返回 val 并很快更新 A 的缓存。由于非同步欺骗是一项非常快的操作,它自然会产生与 (A args) 的并发调用之间的竞争条件。因此,不需要阻塞 (A args) 的调用。(因此,在内部缓存状态上进行 swap! 就足够了)。