title: Improving my first Clojure program
body: <p>After a few weekends exploring Clojure I came up with this program. It allows you to move a little rectangle in a window. Here's the code:</p>
  
  <pre><code>(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))
  </code></pre>
  
  <p>Despite being an experienced C++ programmer I found it very challenging to write even a simple application in a language that uses a radically different style than what I'm used to.</p>
  
  <p>On top of that, this code probably sucks. I suspect the globalness of the various values is a bad thing. It's also not clear to me if it's appropriate to use references here for the x and y values.</p>
  
  <p>Any hints for improving this code are welcome.</p>