问题:函数A被记忆化。函数B(以及其他东西),在从不调用A的情况下,计算有效的A函数调用。我们希望在B中利用此效果以进一步减少A的计算。如果我们期望B比A执行得更快,我们也希望A的调用者等待相应的B运行。
在B中实现该功能的所需操作如下
(spoof A args calc)
其中,calc是一个零参数的fn,它产生一个等于(apply A args)的值。这使得调用者能将calc中恰好的工作量投入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!直接对内部缓存状态进行操作就足够了))。