问题:函数 A 被缓存。函数 B(及其他一些功能)计算 A 的有效函数调用,而从未调用过 A。我们希望在 B 中利用这个效果来进一步减少 A 的计算。如果我们期望 B 比 A 运行得更快,我们也希望 A 的调用者等待相应的 B 运行。
B 中实现此功能的期望操作
(spoof A args calc)
其中 calc 是一个零参数函数,它产生的值等于 (apply A args)。这允许调用者将恰好相当于 calc 预期比 A 更快执行的工作量投入到 calc 中。
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! 就足够了)。