I don't actually 'know' that I need a function that relies on mutable
state, I'm really just trying to understand how to do what I want
using the functional paradigm.

I'm writing a data generator which creates CSV files to be uploaded to
a test database. I'm simulating the behavior of some network objects
(servers, server pools, virtual IP addresses, etc.) and I want to be
able to generate traffic records randomized around an arbitrary
function, like a sine wave. Currently I do something like this:

(def network-object {:name "foo" :value 0})

(defn generate-data [n-timestamps network-objects f]
  (loop [t 0]
    (when (< t n-timestamps)
      (doseq [object network-objects]
        (prn t (object :name) (f (object :value))))
      (recur (inc t)))

So I apply f to each object's value for each time t and I'd like that
function f to modify each network-object's value in a (potentially)
periodic manner. How should I structure my code to do this
functionally? I could (of course) pass the timestamp to f so f is not
stateful and I get effectively the nth value but that seems highly
inefficient. Ideas welcome.

On Oct 14, 11:56 pm, Konrad Hinsen <konrad.hin...@fastmail.net> wrote:
> On 14 Oct 2010, at 21:52, clwham...@gmail.com wrote:
>
> > I need a function that produces the 'next' value from a lazy-seq --
> > something like a Python generator. I imagine it would have to be some
> > sort of closure like:
>
> > (def next-sine
> >    (let [sines (atom (cycle (map sin (range 0 6.28 0.01))))]
> >        #(swap! sines rest)))
>
> > Is there a more idomatic way of doing this? I don't see a lot of use
> > of closures in clojure...
>
> Closures are common in Clojure, but mostly they capture values rather  
> than storage locations.
>
> Could you tell us why you "need" a function that relies on mutable  
> state? Clojure has lots of functions to make, transform, and use  
> sequences in a functional style, and those are usually preferred.
>
> If your need comes from the wish to do stream processing without  
> passing the stream around explicitly among lots of functions, consider  
> using monads to abstract away the stream argument:
>
>        
> http://github.com/clojure/clojure-contrib/blob/master/modules/stream-...
>
> Konrad.

-- 
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