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