Hi Andy,

the issue you're having is that using the & for rest args captures the rest of 
the arguments as a seq. Therefore when you pass a fn as the final parameter to 
#'timed-agent, #'test-func is not bound to the fn you passed in but a seq 
containing that fn. You either need to pull out the fn using something like 
#'first or you can define #'timed-agent to deal with multiple arities:

(defn foo
  "A simple function that will tell you whether you passed
   in 0, 1 or 2 args"
  ([]    (println "no args"))
  ([a]   (println "one arg"))
  ([a b] (println "two args!")))

Sam

---
http://sam.aaron.name

On 3 Nov 2011, at 21:57, AndyK wrote:

> I'm running into a strange problem that I can't see the bottom of.
> Wonder if someone can explain why I'm seeing the behavior I'm
> seeing...
> 
> I have a function that uses a Java timer to run a function and can
> also check the results of that function by passing in an optional test
> function
> 
> (defn timed-agent [limit timed-func & test-func]
>  (let [a (agent 0)
>        ;; test-func can be defined here
>        agent-func (fn [v] (let [result (timed-func v)]
>                             (when test-func (test-func result)) (inc
> v)))
>        t (java.util.Timer.)
>        tt (proxy [java.util.TimerTask] [] (run [] (send-off a agent-
> func)))]
>    (set-validator! a #(> limit %))
>    (.scheduleAtFixedRate t tt 1000 1000)))
> 
> This works if I don't pass in a test function
> (timed-agent 10 prn)
> You will see output of 0 1 2 3...9
> 
> This does not work if I pass in a test function
> (timed-agent 10 prn prn)
> You will see output of 0 and nothing more
> 
> This does work if I define test-func within the function (on the
> commented line) - ex, as prn
> You will see 0 nil 1 nil 2 nil...9 nil
> 
> First question - why can't I pass in a test function and have the
> timer loop work as expected
> Second question - is there a better way for me to set an upper bound
> on a Java timer using Clojure?
> 
> -- 
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your 
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to