我有一對夫婦的有關以下代碼的問題:Clojure的代理問題 - 使用歡送
(import
'(java.awt Color Graphics Dimension)
'(java.awt.image BufferedImage)
'(javax.swing JPanel JFrame))
(def width 900)
(def height 600)
(defn render
[g]
(let [img (new BufferedImage width height
(. BufferedImage TYPE_INT_ARGB))
bg (. img (getGraphics))]
(doto bg
(.setColor (. Color white))
(.fillRect 0 0 (. img (getWidth)) (. img (getHeight)))
(.setColor (. Color red))
(.drawOval 200 200 (rand-int 100) (rand-int 50)))
(. g (drawImage img 0 0 nil))
(. bg (dispose))
))
(def panel (doto (proxy [JPanel] []
(paint [g] (render g)))
(.setPreferredSize (new Dimension
width
height))))
(def frame (doto (new JFrame) (.add panel) .pack .show))
(def animator (agent nil))
(defn animation
[x]
(send-off *agent* #'animation)
(. panel (repaint))
(. Thread (sleep 100)))
(send-off animator animation)
- 在動畫功能 - 爲什麼在歡送動畫之前使用
#'
? - 爲什麼
send-off
在動畫函數開始工作?它不應該只是再次開始動畫功能,並且從不執行重繪和睡眠方法? 是否有任何缺點,相比原來的,以書面形式動畫功能:
(defn animation [x] (. panel (repaint)) (. Thread (sleep 100)) (send-off *agent* animation))
感謝您的解釋。實際上是否需要在這裏使用#'動畫Var?如果不是,爲什麼要麻煩?如果是的話,爲什麼呢?當一個函數不純/需要隱藏狀態/有副作用時需要嗎? – limist 2012-09-28 19:37:37