> On Sat, Jan 8, 2011 at 3:11 PM, Laurent PETIT <laurent.pe...@gmail.com> wrote: >> 2011/1/8 Ken Wesson <kwess...@gmail.com> >>> >>> On Sat, Jan 8, 2011 at 2:09 PM, Laurent PETIT <laurent.pe...@gmail.com> >>> wrote: >>>> 2011/1/8 Ken Wesson <kwess...@gmail.com> >>>>> >>>>> On Sat, Jan 8, 2011 at 12:33 PM, Stuart Halloway >>>>> <stuart.hallo...@gmail.com> wrote: >>>>>> One goal of resource scopes [1] is to help with scoping activities at >>>>>> the REPL. That said, I think this is a "ramping up" problem -- I >>>>>> rarely if >>>>>> ever hit it anymore. >>>>>> >>>>>> Stu >>>>>> >>>>>> [1] http://dev.clojure.org/display/design/Resource+Scopes >>>>> >>>>> Eww. >>>>> >>>>> The more I think about it, the more I'm convinced that it's far >>>>> preferable to use a pure functional approach. Instead of fixing >>>>> >>>>> (defn foo [x] >>>>> (with-open [bar (baz x)] >>>>> (make-some-lazy-seq bar))) >>>>> >>>>> (map do-something-with (foo quux)) >>>>> >>>>> -> IOException: stream closed >>>>> >>>>> with "resource scopes", or even with >>>>> >>>>> (defn foo [x] >>>>> (with-open [bar (baz x)] >>>>> (doall (make-some-lazy-seq bar)))) >>>>> >>>>> (map do-something-with (foo quux)) >>>>> >>>>> isn't the truly functional way to use HOF like this? >>>>> >>>>> (defn foo [x processor] >>>>> (with-open [bar (baz x)] >>>>> (processor (make-some-lazy-seq bar)))) >>>>> >>>>> (foo quux #(map do-something-with %)) >>>> >>>> With the implicit assumption that your processor is not lazy itself ... >>> >>> Yes, obviously. I figure it could be anything from (doall (take 5 >>> ...)) to (reduce #(assoc ...) {} ...) or whatnot, resulting in a >>> number, a map, a short eager seq, or some such. After all you are >>> querying the file for something, boiling it down to something, aren't >>> you? (first (filter identity (map #(re-matches ...) (line-seq ...)))) >>> perhaps, to emit the first occurrence of some pattern in a text file? >>> Whatever. >> >> >> So we can altogether get rid of the concept of lazy seq, following your >> argument :) > > Of course not. It's still useful all the way up to the point that the > result is obtained and distilled down. But using a passed-in function > that consumes it while the with-open or binding is still in effect > makes more sense than making the latter's effect somehow linger in the > lazy-seq, given the difficulties the latter creates both with > implementation and avoiding surprising behavior.
Scopes will not make dynamic bindings linger in lazy seqs. Agreed that is a terrible idea. Stu -- 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