代理无法实现java.lang.Thread
我正试图用java实现这一点代理无法实现java.lang.Thread,java,clojure,Java,Clojure,我正试图用java实现这一点 window.addWindowListener(new WindowAdapter() { @Override public void windowDestroyNotify(WindowEvent arg0){ new Thread(){ @Override public void run(){
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是“(代理[java.lang.Thread]”的开始位置
为什么它不能实现java.lang.Thread这个异常有误导性,但问题是在代理
线程
中的run
方法的实现中,它缺少参数向量
以下表达式在编译时生成相同的异常:
(proxy [Thread] [] (run (inc 1)))
而这一个没有:
(proxy [Thread] [] (run [] (inc 1)))
误导性错误是因为
代理
宏如何解析其参数。异常是误导性的,但问题在于代理线程
中的运行
方法的实现中缺少参数向量
以下表达式在编译时生成相同的异常:
(proxy [Thread] [] (run (inc 1)))
而这一个没有:
(proxy [Thread] [] (run [] (inc 1)))
产生误导性错误的原因是代理宏如何解析其参数。重新开始并从小块开始慢慢构建:
(let [t (Thread. #(println "going 1")) ]
(.start t))
;=> going 1
(let [t (proxy [Thread] []
(run [] (println "going 2")))
]
(.start t))
;=> going 2
因此,您可以看到问题不在于代理
或线程
,而在于您周围的代码
更新
Juan首先注意到了这个问题,因为运行时缺少arglist[]
。通过在上阅读文档并缓慢地构建示例,我自动在示例代码中获得了arglist
我发现,通过“综合”来理解一个问题可以让你绕过许多问题。这通常比通过“分析”来理解一个问题要快得多,也要容易得多,即从成品开始,然后试图找出导致问题的原因。重新开始,从小块开始慢慢构建:
(let [t (Thread. #(println "going 1")) ]
(.start t))
;=> going 1
(let [t (proxy [Thread] []
(run [] (println "going 2")))
]
(.start t))
;=> going 2
因此,您可以看到问题不在于代理
或线程
,而在于您周围的代码
更新
Juan首先注意到了这个问题,因为运行时缺少arglist[]
。通过在上阅读文档并缓慢地构建示例,我自动在示例代码中获得了arglist
我发现,通过“综合”来理解一个问题可以让你绕过许多问题。这通常比通过“分析”来理解一个问题要快得多,也容易得多,即从成品开始,然后试图找出导致问题的原因