Clojure Agent question - using send-off -
i have couple of questions following code:
(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)   - in animation function - why 
#'used before animation in send-off? - why 
send-off@ start of animation function work? shouldn't go start of animation function again , never execute repaint , sleep methods? is there disadvantage, compared original, in writing animation function as:
(defn animation [x] (. panel (repaint)) (. thread (sleep 100)) (send-off *agent* animation))
in animation function - why #' used before animation in send-off?
to demonstrate clojure's dynamic nature.
the form #'animation var, 1 of clojure's mutable reference types.  defn macro creates var.  convenience, invoking var refers function same invoking function itself.  var, unlike function, can change!  redefine #'animation @ clojure repl , see effects.
using (send-off *agent* #'animation) forces clojure of current value of #'animation var every time.  if code had used (send-off *agent* animation) instead, clojure value once, , not possible change animation function without stopping loop.
Comments
Post a Comment