问题:函数A已memo化。函数B(以及其他一些功能),计算A的有效函数调用,但从不调用A。我们希望利用这种效果在B中进一步减少A的计算。如果我们预期B的运行速度比A快,我们还想让调用A的用户在相应的B运行时等待。
B中如何实现所需操作的示例
(spoof A args calc)
其中calc是一个零参数函数,其生成的值等同于(apply A args)。这允许调用者将投入calc中的工作量精确地控制在比A运行得更快。
Spoof返回calc返回的值,或者在缓存命中时返回args的缓存值。也就是说,如果之前发生了(A args)的调用,则不会调用calc。
在已经拥有(A args)的结果且不想被(A args)的并发调用阻塞的情况下,希望的操作是
(spoof-unsynchronized A args val)
它立即返回val并在不久之后更新A的缓存。由于无同步spoof是一种非常快的操作,它不可避免地与(A args)的调用存在竞争条件,因此无需阻塞(A args)的调用。(因此,swap!对内部缓存状态足够了)。