在几个周末探索Clojure之后,我想出了这个计划。它允许您在窗口中移动一个小矩形。下面的代码:改善我的第一个Clojure计划
(import java.awt.Color)
(import java.awt.Dimension)
(import java.awt.event.KeyListener)
(import javax.swing.JFrame)
(import javax.swing.JPanel)
(def x (ref 0))
(def y (ref 0))
(def panel
(proxy [JPanel KeyListener] []
(getPreferredSize [] (Dimension. 100 100))
(keyPressed [e]
(let [keyCode (.getKeyCode e)]
(if (== 37 keyCode) (dosync (alter x dec))
(if (== 38 keyCode) (dosync (alter y dec))
(if (== 39 keyCode) (dosync (alter x inc))
(if (== 40 keyCode) (dosync (alter y inc))
(println keyCode)))))))
(keyReleased [e])
(keyTyped [e])))
(doto panel
(.setFocusable true)
(.addKeyListener panel))
(def frame (JFrame. "Test"))
(doto frame
(.add panel)
(.pack)
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.setVisible true))
(defn drawRectangle [p]
(doto (.getGraphics p)
(.setColor (java.awt.Color/WHITE))
(.fillRect 0 0 100 100)
(.setColor (java.awt.Color/BLUE))
(.fillRect (* 10 (deref x)) (* 10 (deref y)) 10 10)))
(loop []
(drawRectangle panel)
(Thread/sleep 10)
(recur))
尽管是一个经验丰富的C++程序员,我发现它非常具有挑战性的在使用一种完全不同的风格比我用语言编写甚至一个简单的应用程序。
最重要的是,这段代码可能很糟糕。我怀疑各种价值观的全球性是件坏事。我也不清楚在这里使用x和y值的引用是否合适。
欢迎提供改进此代码的任何提示。
我正在学习Clojure的了。感谢问题和工作代码示例。 – mcotton 2010-05-08 04:00:52
@mcotton,很高兴你觉得它有帮助。也许这些笔记也很有用:http://www.reddit.com/r/programming/comments/c16rr/clojure_notes/ – StackedCrooked 2010-05-08 14:26:30
我喜欢这个程序!当在leiningen下运行时,我偶尔会得到'线程异常AWT-EventQueue-0'java.lang.IllegalArgumentException:没有匹配的子句:157',无论是通过lein run还是通过lein uberjar运行它。我不知道这个错误来自哪里。 – 2013-03-24 14:36:26