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

欢迎!有关如何使用本站的更多信息,请参阅关于页面。

+3
Clojure

如果你来自 Java,你可能会期望 proxy-super 很安全,但实际上,proxy-super 通过在调用 proxy-super 之前修改代理对象,然后在调用之后恢复它来运作。这可能导致非常奇怪的行为。如果你有一个调用 proxy-super 的代理 M 方法,那么当 proxy-super 运行时,对该代理对象的所有对 M 的调用将立即调用超类 M 而不是代理 M。

使 proxy-super 安全(不仅仅是线程安全的,而是在相同调用堆栈中稍后被调用时也安全)可能真的很难,但会很不错。或者,在文档字符串中加入一些闪烁的危险灯信号可能是个好主意。

3 答案

+1

Clojure 的代理实现有点奇怪。Nathan Marz 开发了一个竞争性库以提供代理,我扩展了它以支持在解决核心 Clojure 问题之前而支持的调用超类方法。

存在一些设计问题;我看不到模仿 Java 的语义的方式,在 Java 中,对超类的调用仅以受控方式进行 - 由于代理方法可能来自任何地方,因此 Clojure 似乎不支持这种模式。

0

评论者:freekpaans

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

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