On Jul 20, 1:27 am, kyle smith <the1physic...@gmail.com> wrote:
> I'm trying to use Stuart Sierra's implementation of cells. I want to
> sum the values of a large number of cells. Rather than linearly
> summing all the values, I would like to create a tree of cells whose
> root contains the sum. I added the function commute-cells:
>
> (defn commute-cells [f cells]
> (let [len1 (count cells)
> len2 (/ len1 2)]
> (cond (= 1 len1)
> (first cells)
> (= 2 len1)
> (cell (f (cv (first cells))
> (cv (second cells))))
> true
> (cell (f (cv (commute-cells f (take len2 cells)))
> (cv (commute-cells f (drop len2 cells))))))))
>
> This seems to work for small numbers of cells, but never finishes for
> larger values.
>
> user> (reduce + (range 10))
> 45
> user> (def cells (map #(cell %) (range 10)))
> #'user/cells
> user> (def sum (commute-cells + cells))
> 45
> user> (reduce + (range 1000))
> 499500
> user> (def cells (map #(cell %) (range 1000)))
> #'user/cells
> user> (def sum (commute-cells + cells))
> ; Evaluation aborted.
>
> Do I need to make this a macro? If so, could someone help me out, and
> make a macro for the linear version as well?
It looks to me like you are blowing the stack. You may want to rethink
your commute-cells function so that it either uses the 'recur'
operator and is tail recursive, or uses a trampoline of some sort.
hth,
-Jon
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---