Después de algunos fines de semana explorando Clojure, se me ocurrió este programa. Te permite mover un pequeño rectángulo en una ventana. Aquí está el código:Mejorando mi primer programa 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))
pesar de ser un programador de C++ con experiencia Me pareció muy difícil de escribir incluso una sencilla aplicación en un idioma que utiliza un estilo radicalmente diferente a lo que estoy acostumbrado.
Además de eso, este código probablemente es una mierda. Sospecho que la globalidad de los diversos valores es algo malo. Tampoco es claro para mí si es apropiado usar referencias aquí para los valores xey.
Cualquier sugerencia para mejorar este código es bienvenido.
estoy trabajando en clojure aprendizaje también. Gracias por la pregunta y la muestra del código de trabajo. – mcotton
@mcotton, me alegra que lo encuentre útil. Quizás estas notas también sean útiles: http://www.reddit.com/r/programming/comments/c16rr/clojure_notes/ – StackedCrooked
¡Me encanta este programa! Cuando lo ejecuto bajo leiningen, de vez en cuando obtengo 'Exception in thread' AWT-EventQueue-0 "java.lang.IllegalArgumentException: No hay una cláusula que coincida: 157', ya sea que se ejecute mediante' lein run' o mediante 'lein uberjar'. No tengo idea de dónde viene este error. –