请在 2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面了解此工作的更多信息。

+3
Clojure

从 Java 来看,您可能认为 proxy-super 不会造成太大问题,但 proxy-super 通过修改代理对象并在调用 proxy-super 后恢复它来运行。这可能导致非常奇怪的行为。如果您有一个调用 proxy-super 的代理方法 M,那么当 proxy-super 运行时,对这个代理对象的 M 的所有调用将立即调用 super M,而不是代理 M。

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

3个回答

+1
#

Clojure 的代理实现有点奇怪。Nathan Marz 创建了一个竞争库以提供代理,我在等待有人修复核心 Clojure 的时候扩展了它以支持对超类方法的调用。

存在一些设计问题;我看不到模仿 Java 中调用超类语义的方式,只有受控的调用——Clojure 的模型似乎阻止了这一点,因为代理方法可能来自任何地方。

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报告)
...