这个问题更像是一个解决方案的提议,而不是一个问题,这让我不确定将该提案作为工单提交到哪个地方。我不确定CLJ-2094是不是您真正关心的问题,或者它是不是其他问题?如果是其他问题,请分享。
在这里尝试用语言将建议的解决方案表达出来...在查找协议方法匹配时,通过var查找当前协议值(var可能已被新扩展更新),而不是使用传递的协议值(因为这可能不再代表当前状态)。
但是,协议已经有机制在添加扩展到协议时重置其状态,所以我认为这个问题已经基本解决。唯一可能协议状态不匹配当前状态的情况是,您有的协议状态不再连接。在这种情况下,我认为这是因为在协议函数var中持有的是一个函数实例,该实例有一个缓存,缓存中包含协议,但函数实例本身是旧的(var持有新的函数实例)。
所以您使用了一个无效函数,但在方法调用过程中查找以恢复活动函数的等效状态。在调用过程中添加var查找在我看来是一个失败的想法,因为整个协议设计都在试图避免这一点(这就是为什么我们有在修改时可以清空的缓存)。这里的替代解决方案是将函数的var查找推向调用者。这正是CLJ-2094的匿名函数实现规格(与partial相对)所提供的东西(vs部分)。
再次强调,我不确定我们真正试图解决的问题是什么。在CLJ-2094中,问题是函数被partial捕获。解决方案是——不要捕获值。我们也可以考虑一些替代的partial,它保留了var查找——您可以想象一个partial-var,它接受一个var而不是从符号中解析出的函数。解决方法是使用wrap在函数中延迟评估。这足够成为引入新技术的问题吗?不知道。