在幾個週末探索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