问题:函数A进行了memoize。函数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!内部缓存状态应该就可以了)。