我试图在java中实现它
window.addWindowListener(new WindowAdapter() {
@Override
public void windowDestroyNotify(WindowEvent arg0){
new Thread(){
@Override
public void run(){
animator.stop();
System.exit(0);
}
}.start();
};
});
就像在clojure中那样
(.addWindowListener (proxy [WindowAdapter][]
(windowDestroyNotify [arg0]
(.start (proxy [java.lang.Thread][]
(run
(.stop ani)
(System/exit 0)))))))
但是当我运行它时,它会给我这个错误
CompilerException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol, compiling: (program/core.clj:36:36)
36:36是“(proxy [java.lang.Thread]”开始的地方
为什么不能实现java.lang.Thread
答案 0 :(得分:2)
该异常具有误导性,但问题在于代理run
中Thread
方法的实现,它缺少参数向量。
编译时的以下表达式会生成相同的异常:
(proxy [Thread] [] (run (inc 1)))
虽然这个没有:
(proxy [Thread] [] (run [] (inc 1)))
误导性错误是因为proxy
宏如何解析其参数。
答案 1 :(得分:0)
从小块开始慢慢建立起来:
(let [t (Thread. #(println "going 1")) ]
(.start t))
;=> going 1
(let [t (proxy [Thread] []
(run [] (println "going 2")))
]
(.start t))
;=> going 2
因此,您可以在周围的代码中看到问题不是proxy
或Thread
。
Juan首先发现问题是[]
缺少的arglist run
。通过阅读https://clojuredocs.org/clojure.core/proxy处的文档并慢慢构建示例,我自动在示例代码中获得了arglist。
我发现通过“综合”理解问题可以绕过许多问题。它往往更快更快比通过“分析”试图理解问题更容易,在那里你从成品开始,然后试着找出导致它出错的原因。