Thanks, Justin! Yeah, I noticed that range doesn't return an instance of clojure.lang.LazySeq, so I added a print-method for clojure.lang.Iterate. And that one seems to work as expected, but apparently you can't override the print-method for clojure.lang.LazySeq.
But this doesn't seem like a good approach, anyway, because I don't want to change the printing behavior globally. I think I'm just going to have to forego logging arbitrary things, and maybe implement some optional santization if necessary. On Monday, November 2, 2020 at 12:40:48 PM UTC-8 noise...@gmail.com wrote: > hit send too soon -- > > also, that print-method doesn't catch all lazy values > > user=> (instance? clojure.lang.LazySeq (range)) > false > > user=> (supers (class (range))) > #{java.lang.Iterable java.util.List clojure.lang.Obj > clojure.lang.IPending java.io.Serializable clojure.lang.IHashEq > java.util.Collection clojure.lang.IObj clojure.lang.Sequential > clojure.lang.Seqable clojure.lang.IPersistentCollection > clojure.lang.ASeq clojure.lang.IReduce java.lang.Object > clojure.lang.ISeq clojure.lang.IMeta clojure.lang.IReduceInit} > > On Mon, Nov 2, 2020 at 12:36 PM Justin Smith <noise...@gmail.com> wrote: > > > > > The next step might be to investigate why infinite lazy seqs don't > print as clojure.lang.LazySeq, like the finite ones. > > > > that printing of "clojure.lang.LazySeq@c5d38b66" relies on completely > > realizing the input, as it relies on the hash, which relies on the > > fully realized value > > > > On Mon, Nov 2, 2020 at 12:32 PM Austin Haas <aus...@pettomato.com> > wrote: > > > > > > Thanks, Juan. > > > > > > I don't need to know the length of the seq, though, only that it is > lazy. I don't want to realize any lazy seqs. Ideally, I'd like to be able > to print any data structure and have all lazy seqs print just like it does > in the example I gave above (i.e., "clojure.lang.LazySeq@c5d38b66"), > whether it is finite or infinite. > > > > > > I also don't want to walk through every data structure to check if it > contains a lazy seq, but maybe that is the only option. > > > > > > I've also tried: > > > > > > (defmethod print-method clojure.lang.LazySeq [q, w] > > > (.write w "#clojure.lang.LazySeq")) > > > > > > The next step might be to investigate why infinite lazy seqs don't > print as clojure.lang.LazySeq, like the finite ones. > > > On Monday, November 2, 2020 at 9:22:58 AM UTC-8 jpmon...@gmail.com > wrote: > > >> > > >> Hi Austin, > > >> > > >> Since there is no way to know the length of a lazy-seq without > realizing it, I think your only choice is to set a limit on it by binding > *print-length* if you are not sure about the sequence. > > >> > > >> Other thing you can try is bounded-count like this : > > >> > > >> (defn looks-finite? [xs] > > >> (let [limit 1000] > > >> (< (bounded-count limit xs) limit))) > > >> > > >> (looks-finite? (map inc (range))) ;; => false > > >> (looks-finite? (map inc (range 100))) ;; => true > > >> > > >> I hope that helps. > > >> > > >> Juan > > >> El domingo, 1 de noviembre de 2020 a las 20:06:39 UTC-3, Austin Haas > escribió: > > >>> > > >>> > > >>> How can I make sure that a logging function won't try to realize an > infinite lazy seq that could be anywhere in the arguments passed to the > logging function? > > >>> > > >>> Is there some way to guarantee that lazy seqs won't be realized when > converting to a string? > > >>> > > >>> I know I can bind *print-length*, but I don't want to constrain > every collection. > > >>> > > >>> And I know that lazy seqs aren't always realized, but that doesn't > seem to help if they are infinite: > > >>> > > >>> user=> (str (map inc (range 10))) > > >>> "clojure.lang.LazySeq@c5d38b66" > > >>> > > >>> user=> (str (map inc (range))) > > >>> <never ends> > > >>> > > >>> Thanks. > > >>> > > > -- > > > 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. > > > To view this discussion on the web visit > https://groups.google.com/d/msgid/clojure/ab820e20-75ad-4852-aa01-9321cb7487b4n%40googlegroups.com > . > -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/clojure/6c27681a-99df-453d-b4aa-3add5f20294dn%40googlegroups.com.