问题:函数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!内部缓存状态应该就足够了)