这个问题更像是提出的解决方案而不是问题,这使得我很难将其作为工单提交。我不确定CLJ-2094是不是你真正关心的问题,或者是否还有其他问题?如果是其他问题,请分享。
在这里尝试将建议的解决方案用文字表达出来... 在寻找协议方法匹配时,通过var查找当前协议值(可能已更新为新扩展),而不是使用传递的协议值(因为它可能不再代表当前状态)。
但是协议已经有了当协议添加扩展时重置其状态的机制,所以我认为这个问题已经基本解决。唯一协议状态不匹配当前状态的方法是,你拥有的协议状态不再连接。在这种情况下,我认为这是因为在协议函数var持有一个函数实例,它有一个缓存,缓存中包含协议,但函数实例本身是旧的(var持有新的函数实例)。
所以你正在使用一个无效的函数,但在方法调用时进行查找以恢复活动函数的等效状态。我认为在调用过程中添加var查找不是一个合适的方案,因为整个协议设计都在试图避免这一点(这就是为什么我们有可以在修改时导出的缓存)。这里的替代方案是将函数的var查找推到调用者那里。这就是你在CLJ-2094中通过匿名函数实现规范所得到的结果(与部分函数相比)。
再次,我不确定我们实际上试图解决的问题是什么。在CLJ-2094中,问题是函数被部分函数捕获。解决方案是不捕获值。我们还可以考虑一些替代方案来保留var查找——你可以想象一个partial-var,它接收一个var而不是从符号中评估出的函数。一种解决方案是在函数中使用wrap来延迟评估。这是一个足够的问题需要新方案吗?我不知道。