On Mar 9, 2:27 pm, Ken Wesson <kwess...@gmail.com> wrote: > It seems to me there is a way to make the JVM's stack effectively > deeper -- even limited only by available memory. > > Threads have separate stacks, and there's no limit on threads, > *especially* if they're nearly all sleeping. So ... > > (defn apply-with-stack-extension [f & args] > (let [x (future > (try > [(apply f args) nil] > (catch Throwable t [nil t]))) > [res exc] @x] > (if exc (throw exc) res))) > > In theory (untested as yet) this should act like "apply", except that > almost the full maximum stack depth is available to f, no matter how > far the stack has piled up with apply-with-stack-extension. As a side > effect, if an exception is thrown its stack trace starts after the > last apply-with-stack-extension; everything before that is cut off. > That may be more of a mixed blessing than a curse. :) > > In practice, something like this (plus tracking nesting depth to > trigger it every 100 or so stack frames) could be used to make the > lazy-stuff framework much more resistant to SOE throws. Another > variation is to have an SOE handler in many common lazy functions, > like map, that catches SOE and retries using > apply-with-stack-extension, or using a version of the function that > applies it periodically. That might reduce the performance impact to > nearly nil for cases that don't have a problem with SOE without > a-w-s-e.
Clever, but do we really want to encourage writing code that blows infinite stack, by burying the problem until all of the JVM's memory has been used up for stack? I agree there's a place for this sort of thing, but I don't think we would want to make it any kind of default for things like map/filter. -- 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