2024 Clojure 状态调查!中分享你的想法。

欢迎!请参阅关于页面以了解更多关于这是如何工作的信息。

+3
Clojure

从Java切换过来的你可能会认为proxy-super相对无害,但proxy-super通过修改代理对象,然后在调用proxy-super后将其恢复,来实现其功能。这可能导致非常奇怪的行为。如果你有一个方法M的代理,该方法调用proxy-super,那么当proxy-super正在运行时,对该代理对象所有调用M的方法都将立即调用super M而不是proxied M。

使proxy-super真正安全(不仅是线程安全的,而且在使用调用栈中的同一调用的后续调用上也是安全的)可能非常困难,但这将是不错的。或者,在文档字符串中加入一些闪烁的警告灯可能是个好主意。

3个回答

+1

Clojure的代理实现有点奇怪。Nathan Marz构建了一个竞争库来提供代理,我将其扩展为支持对超类方法的调用,直到有人修复核心Clojure。

存在一些设计问题;我看不出如何模仿Java中只有在受控方式下对超类进行调用的语义 - Clojure的模型似乎不允许这样,因为proxied方法可能来自任何地方。

0

评论者:freekpaans

当我尝试包裹对队列的调用时遇到了这个问题:[https://stackoverflow.com/questions/49862954/clojure-proxy-multithreading-issue](https://stackoverflow.com/questions/49862954/clojure-proxy-multithreading-issue)

0
参考:[https://clojure.atlassian.net/browse/CLJ-2201](https://clojure.atlassian.net/browse/CLJ-2201)(由hiredman报告)
...