这个问题更像是一个提议的解决方案,而不是一个问题,这让我不确定该把它作为工单提交到哪个地方。我不确定CLJ-2094是否是你真正关心的问题,还是其他什么问题?如果是其他问题,请分享。
尝试将建议的解决方案用文字表达出来……当查找协议方法匹配时,通过var查找当前协议的值(它可能已被新扩展更新),而不是使用传递的协议值(因为这可能不再代表当前状态)。
但是,协议已经有了在添加扩展到协议时重置其状态的机制,所以我认为这个问题已经被基本解决。唯一不匹配当前状态的情况是,你有的协议状态不再连接。在这种情况下,我认为这是因为协议功能var持有的是一个函数实例,这个实例有一个缓存,里面有协议,但函数实例本身是旧的(var里持有的是新的函数实例)。
所以,你正在使用一个无效的函数,但在方法调用期间进行查找以恢复活动函数的等效状态。我认为将var查找添加到调用路径中并不是一个好主意,因为这 whole 协议设计都在试图避免这种情况(这就是为什么我们有缓存,可以被修改时清空)。这里的替代解决方案是将函数的var查找推送给调用者。这正是CLJ-2094中对规范匿名函数实现与局部函数(partial)实现相比所得到的结果。
再次,我不确定我们实际上试图解决什么问题。在CLJ-2094中,问题是函数被部分(partial)捕获了。解决方案是——不要捕获值。我们也可以考虑一些替代的局部函数(partial),它保留了var查找——你可以想象一个接受var而不是从符号中计算出的函数值的局部-var。解决方案是使用wrap在一个函数中延迟计算。这足够成为引入新功能的问题吗?我不知道。