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