这个问题更像是一个提议的解决方案而非问题,这使得我难以将其作为工单记录。我不确定 CLJ-2094 是否是你真正关心的实际问题,还是其他方面。如果是其他方面,请分享。
在此尝试用文字描述提出的解决方案... 当寻找协议方法匹配时,通过变量查找当前协议值(该变量可能已经被新的扩展更新),而不是使用传递的协议值(因为这可能不再代表当前状态)。
但是,协议已经有了机制来在添加扩展到协议时重置其状态,因此我认为这个问题已经基本解决。只有当协议状态没有与当前状态匹配时,才有可能。在这种情况下,我认为原因是协议函数 var 包含一个函数实例,该实例有一个缓存,包含协议,但函数实例本身是旧的(var 包含新的函数实例)。
所以你使用的是一个无效函数,但在方法调用期间执行查找以恢复活动函数的等价状态。在调用路径中添加 var 查找似乎是行不通的,因为整个协议设计都在试图避免这一点(这就是我们为什么有一个在修改时可以丢弃的缓存)。这里的替代方案是将函数的 var 查找推向调用者。这正是 CLJ-2094 中对于匿名函数实现规范(与部分函数相比)所获得的内容。
再次提醒,我不确定我们实际上想要解决什么问题。在 CLJ-2094 中,问题是函数被部分函数捕获。解决方案是 - 不要捕获值。我们还可以考虑某些替代的方案来保留 var 查找 - 你可以想象一个 partial-var,它接受一个 var 而不是从符号中评估的函数。一种权宜之计是使用 wrap 在函数中延迟评估。这算是一个足够的问题,需要新的解决方案吗?我不知道。