这个问题更多的是一个建议的解决方案,而不是一个问题,这使得我很难把它作为票据文件。我不确定 CLJ-2094 是否是您关心的真正问题,还是其他问题?如果是其他问题,请分享。
在此尝试用文字描述建议的解决方案...在找到协议方法匹配时,通过变量查找当前的协议值(该变量可能已被新扩展更新过),而不是使用传递的协议值(因为这可能不再代表当前状态)。
但协议已经有机制在添加扩展到协议时重置其状态,所以我认为这个问题已经基本解决。唯一协议状态不匹配当前状态的情况是,您拥有的协议状态不再连接。在这种情况下,我认为这是因为协议功能变量持有的是一个函数实例,该实例有一个缓存,其中包含协议,但该函数实例本身是旧的(变量持有新的函数实例)。
因此,您正在使用一个已死的函数,但在方法调用期间执行查找以恢复活动函数的等效状态。我认为在调用调用路径中添加变量查找是不切实际的,因为整个协议设计都在试图避免这一点(这就是为什么我们有可以在修改时排空的缓存)。这里的另一种解决方案是将函数的变量查找推向调用者。这正是CLJ-2094中规范匿名函数实现(与部分函数相对)所获得的内容。
再次强调,我并不清楚我们真正试图解决的问题是什么。在CLJ-2094中,问题是函数被部分函数捕获。解决方案是不要捕获值。我们还可以考虑一些替代方案,比如部分函数保留了变量查找 - 你可以想象一个接部分变量的函数,它接受一个变量而不是从符号中评估出的函数。一种权宜之计是使用包装在函数中延迟评估。这足够成为新功能的问题吗?不知道。