问题:函数 A 已进行记忆化。函数 B(及其他操作)计算一个有效的 A 函数调用,而从未调用过 A。我们希望在 B 中使用这种效果,进一步减少 A 的计算量。如果我们期望 B 比 A 运行得快,我们也希望 A 的调用者等待相应的 B 正在运行时。
B 中实现这一点的期望操作方法是
(spoof A args calc)
其中 calc 是一个无参数的 fn,它产生一个等于 (apply A args) 的值。这允许调用者将正好等于他期望比 A 快的工作量放入 calc。
Spoof 返回 calc 返回的值或 cache 中为 args 存储的值。例如,如果在调用 (spoof A args calc) 之前发生了一个 (A args) 的调用,calc 将不会被调用。
在已经得到 (A args) 的结果且不希望被 (A args) 的并发调用阻塞的情况下,期望的操作是
(spoof-unsynchronized A args val)
它立即返回 val 并尽快更新 A 的缓存。由于非同步欺骗是一种非常快速的操作,它无论如何都会与 (A args) 的调用发生竞争条件,所以不需要阻塞 (A args) 的调用。 (因此,swap! 内部缓存状态就足够了)。