这个问题更像是提出的解决方案而不是问题,这让我难以将其作为一个工单提交。我不确定CLJ-2094是不是你真正关心的问题,或者是其他某个问题?如果是其他问题,请分享一下。
在这里尝试用文字描述一下建议的解决方案... 当找到一个协议方法匹配时,通过var获取当前协议值(可能已经被新的扩展更新),而不是使用传递的协议值(因为这可能不再表示当前状态)。
但是,协议已经具有在添加扩展到协议时重置其状态的机制,所以我认为这个问题已经基本解决了。唯一无法匹配当前状态的情况是,你拥有的协议状态已经不再连接。在这种情况下,我认为这是因为协议函数var持有的是一个函数实例,该实例包含一个缓存的协议,但函数实例本身是旧的(var持有一个新的函数实例)。
所以你可能在使用一个已死亡的功能,但在方法调用期间进行查找以恢复活动等价状态。我认为在调用路径中添加var查找是不现实的,因为这与整个协议设计试图避免的是(这就是为什么我们有一个在修改时可以清空的缓存)。这里的替代方案是将函数的var查找推送到调用者。这正是CLJ-2094中对规范的非匿名函数实现所做的(与部分相对)。
同样,我不确定我们实际上试图解决的问题是什么。在CLJ-2094中,问题是函数被partial捕获。解决方案是不捕获值。我们也可以考虑一些替代partial的方法,保留var查找——你可以想象一个partial-var,它接受一个var,而不是从符号评估得到的函数。解决方法是使用wrap在一个函数中延迟评估。这个问题是否值得产生新的东西?我不知道。