On Saturday, April 4, 2015 at 12:09:36 PM UTC-4, Andy Fingerhut wrote: > > > > On Sat, Apr 4, 2015 at 8:52 AM, Paul Roush <pro...@gmail.com <javascript:> > > wrote: > >> I have 2 questions related to bigints. >> >> 1) I've read things suggesting Clojure auto-converts between int, long, >> and bigint to prevent overflow. That isn't the behavior I've experienced. >> Did something change from an older release of Clojure to more recent ones? >> > > Clojure 1.2 and earlier auto-promoted, if I recall correctly, but that has > not been the case since Clojure 1.3, released in Sep 2011. You may have > found something published before then. > > Clojure 1.3 and later do give a bigint result for integer arithmetic if > any of the arguments are bigints, e.g. (+ 1N 1) => 2N >
Thanks for the historical info. > >> >> 2) I found myself wanting to write a function that would use bigint math >> vs not depending on whether I passed a bigint in as arg. Internally I >> wanted to "seed" a reduce call with either 1 or 1N as appropriate. So I >> wanted to write something like this (except I'd like it to work): >> >> (defn foo [n] >> (cast (type n) 1)) >> >> ; (foo 3) => 1 >> ; (foo 42N) => 1N >> >> The following works, but I'd like to understand if I can avoid the >> conditional: >> >> (defn foo [n] >> (if (= clojure.lang.BigInt (type n)) 1N 1)) >> > > More commonly I have seen (instance? clojure.lang.BigInt n) rather than (= > clojure.lang.BigInt (type n)), but I do not know any way to avoid the > conditional here. > > I would ask that you consider whether you really do need this check, > though, since if your argument is BigInt and is combined with any > arithmetic operation with a local long value in the function, the result > will be BigInt. > > Andy > I like your conditional better, so seeing that is welcome. Regarding the last point, I understand that what you say is generally true, but in this specific case my function arg was defining the end of a 'range' call that was fed into other logic. (range 5N) => (0 1 2 3 4) ; i.e. the "bigint-ness" is lost So in this particular case I needed to "inject" bigint into the process later in some way. -- 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/d/optout.