or perhaps it's that macroexpand drops the ^:once On Thursday, September 12, 2013 10:55:28 AM UTC-7, Brian Craft wrote: > > I think my monkey-patch of jdbc/transaction didn't take. Doing > user/sourcery on it shows your version, but doing a macroexpand-all shows > the original. > > My code calls via korma as kdb: > > => (clojure.walk/macroexpand-all '(kdb/transaction nil)) > (if (clojure.java.jdbc/find-connection) (clojure.java.jdbc/transaction* > (fn* [] nil)) (clojure.java.jdbc/with-connection* (korma.db/get-connection > (clojure.core/deref korma.db/_default)) (fn* ([] > (clojure.java.jdbc/transaction* (fn* [] nil)))))) > > I thought I could get it to take by doing a (require 'clojure.java.jdbc) > and applying the patch before doing a require on korma, but that doesn't > seem to help. > > (require 'clojure.java.jdbc) > ; XXX monkey-patch jdbc to avoid head retention bug > (in-ns 'clojure.java.jdbc) > (defmacro transaction > [& body] > `(transaction* (^:once fn* [] ~@body))) > > (ns <blahblah> (:require [korma.db as kdb])) > > .. and restart the repl, but macroexpand-all still gives me the result > above. > > On Wednesday, September 11, 2013 1:45:41 PM UTC-7, Christophe Grand wrote: >> >> I don't get the same results: >> >> $ LEIN_JVM_OPTS=-Xmx20M lein repl >> nREPL server started on port 61221 on host 127.0.0.1 >> REPL-y 0.2.1 >> Clojure 1.5.1 >> Docs: (doc function-name-here) >> (find-doc "part-of-name-here") >> Source: (source function-name-here) >> Javadoc: (javadoc java-object-or-class-here) >> Exit: Control+D or (exit) or (quit) >> >> user=> (defn f [g] (g)) >> #'user/f >> user=> (defn t1 [n c] (f (fn [] (dorun (map identity c))))) >> #'user/t1 >> user=> (t1 0 (range 1000000)) >> >> OutOfMemoryError GC overhead limit exceeded java.lang.Long.valueOf >> (Long.java:577) >> user=> (defn t2 [n c] (f (fn [] (doseq [x c] (identity x))))) >> #'user/t2 >> user=> (defn t1 [n c] (f (^:once fn* [] (dorun (map identity c))))) >> #'user/t1 >> user=> (t1 0 (range 1000000)) >> nil >> user=> (t2 0 (range 1000000)) >> >> OutOfMemoryError GC overhead limit exceeded >> clojure.lang.ChunkBuffer.chunk (ChunkBuffer.java:29) >> >> BUT this is because the previous OOM left the JVM in a dirty state: try >> to reorder your expressions: >> >> $ LEIN_JVM_OPTS=-Xmx20M lein repl >> nREPL server started on port 61245 on host 127.0.0.1 >> REPL-y 0.2.1 >> Clojure 1.5.1 >> Docs: (doc function-name-here) >> (find-doc "part-of-name-here") >> Source: (source function-name-here) >> Javadoc: (javadoc java-object-or-class-here) >> Exit: Control+D or (exit) or (quit) >> >> user=> (defn f [g] (g)) >> #'user/f >> user=> (defn t2 [n c] (f (fn [] (doseq [x c] (identity x))))) >> #'user/t2 >> user=> (t2 0 (range 1000000)) >> nil >> >> ^^this last one failed in the previous run. >> >> I'm not quite sure about why the doseq version works -- I would have to >> research a bit. My gut feeling is that doseq is based on loop and loops are >> lifted into ^:once fn* by the compiler in some cases. >> https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L5951 >> >> >> >> On Wed, Sep 11, 2013 at 8:20 PM, Brian Craft <craft...@gmail.com> wrote: >> >>> Correct, I forgot to paste that part. ;) >>> >>> >>> On Wednesday, September 11, 2013 10:57:09 AM UTC-7, Sean Corfield wrote: >>> >>>> Just to confirm, (t2 0 (range 1000000)) -- using doseq instead of >>>> dorun -- does NOT run out of memory, correct? >>>> >>>> On Wed, Sep 11, 2013 at 8:59 AM, Brian Craft <craft...@gmail.com> >>>> wrote: >>>> > This appears to have no effect on the problem. I tested with >>>> > jdbc/transaction, and with Sean's simple example: >>>> > >>>> > user=> (defn f [g] (g)) >>>> > #'user/f >>>> > user=> (defn t1 [n c] (f (fn [] (dorun (map identity c))))) >>>> > #'user/t1 >>>> > user=> (t1 0 (range 1000000)) >>>> > java.lang.OutOfMemoryError: Java heap space (NO_SOURCE_FILE:0) >>>> > user=> (defn t2 [n c] (f (fn [] (doseq [x c] (identity x))))) >>>> > #'user/t2 >>>> > user=> (defn t1 [n c] (f (^:once fn* [] (dorun (map identity c))))) >>>> > #'user/t1 >>>> > user=> (t1 0 (range 1000000)) >>>> > java.lang.OutOfMemoryError: Java heap space (NO_SOURCE_FILE:0) >>>> > >>>> > >>>> > >>>> > On Wednesday, September 11, 2013 7:39:48 AM UTC-7, Christophe Grand >>>> wrote: >>>> >> >>>> >> ^:once on fn* (not fn, the fn macro doesn't propagate metadata) >>>> instructs >>>> >> the commielr to clear closed-overs ASAP. It follows that you can't >>>> call such >>>> >> a function twice because it forgets its closed-overs. >>>> >> >>>> >> >>>> >> On Wed, Sep 11, 2013 at 4:36 PM, Brian Craft <craft...@gmail.com> >>>> wrote: >>>> >>> >>>> >>> ugh. Can't find documentation for this. What does it do? >>>> >>> >>>> >>> On Wednesday, September 11, 2013 2:22:56 AM UTC-7, Christophe Grand >>>> >>> wrote: >>>> >>>> >>>> >>>> >>>> >>>> On Wed, Sep 11, 2013 at 6:00 AM, Brian Craft <craft...@gmail.com> >>>> wrote: >>>> >>>>> >>>> >>>>> (defmacro transaction >>>> >>>>> [& body] >>>> >>>>> `(transaction* (fn [] ~@body))) >>>> >>>>> >>>> >>>>> I'm not sure how to avoid that. The anonymous function created >>>> here >>>> >>>>> doesn't take parameters. >>>> >>>> >>>> >>>> >>>> >>>> The fix for this is: >>>> >>>> (defmacro transaction >>>> >>>> [& body] >>>> >>>> `(transaction* (^:once fn* [] ~@body))) >>>> >>>> >>>> >>>> It should be the default for all one-shot fns. >>>> >>>> >>>> >>>> Christophe >>>> >>>> >>>> >>>> -- >>>> >>>> On Clojure http://clj-me.cgrand.net/ >>>> >>>> Clojure Programming http://clojurebook.com >>>> >>>> Training, Consulting & Contracting http://lambdanext.eu/ >>>> >> >>>> >> >>>> >> >>>> >> >>>> >> -- >>>> >> On Clojure http://clj-me.cgrand.net/ >>>> >> Clojure Programming http://clojurebook.com >>>> >> Training, Consulting & Contracting http://lambdanext.eu/ >>>> > >>>> > -- >>>> > -- >>>> > You received this message because you are subscribed to the Google >>>> > Groups "Clojure" group. >>>> > To post to this group, send email to clo...@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+u...@**googlegroups.com >>>> > For more options, visit this group at >>>> > http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en> >>>> > >>>> > --- >>>> > You received this message because you are subscribed to the Google >>>> Groups >>>> > "Clojure" group. >>>> > To unsubscribe from this group and stop receiving emails from it, >>>> send an >>>> > email to clojure+u...@**googlegroups.com. >>>> > For more options, visit >>>> > https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>. >>>> > >>>> >>>> >>>> >>>> >>>> -- >>>> Sean A Corfield -- (904) 302-SEAN >>>> An Architect's View -- http://corfield.org/ >>>> World Singles, LLC. -- http://worldsingles.com/ >>>> >>>> "Perfection is the enemy of the good." >>>> -- Gustave Flaubert, French realist novelist (1821-1880) >>>> >>> -- >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clo...@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+u...@googlegroups.com >>> For more options, visit this group at >>> http://groups.google.com/group/clojure?hl=en >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to clojure+u...@googlegroups.com. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >> >> >> >> -- >> On Clojure http://clj-me.cgrand.net/ >> Clojure Programming http://clojurebook.com >> Training, Consulting & Contracting http://lambdanext.eu/ >> >
-- -- 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 --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.