问题:函数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的缓存命中时缓存的内容。也就是说,如果在调用(spoof A args calc)之前已经发生了(A args)的调用,则不会调用calc。
在我们的情况下,如果我们已经有(A args)的结果,而不想被(A args)的并发调用所阻塞,那么希望的函数是
(spoof-unsynchronized A args val)
它立即返回val并很快更新A的缓存。由于异步仿冒是一个非常快速的运算,它会与(A args)的调用发生竞态条件,因此不必阻塞(A args)的调用。(所以swap!内部缓存状态应该足够)。