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