On Mar 27, 2012 6:26 PM, "Andrea Chiavazza" <ndrch...@gmail.com> wrote: > > Hello everyone > > I had a go at adding support for complex numbers, it's at: > https://github.com/andrea-chiavazza/clojure/tree/complex > > Some repl usage examples: > > user=> (/ (complex 73 13) (complex 15 25)) > #<Complex (142/85 -163/85i)> > > user=> (/ (complex 73 13) (complex 15.0 25.0)) > #<Complex (1.6705882352941177 -1.9176470588235295i)> > > user=> (+ (complex 13 34) (complex 29 -34)) > 42 > > user=> (require 'clojure.math) > > user=> (clojure.math/abs (complex -14.94 21)) > 25.772147756832375 > > user=> (clojure.math/sqrt -3) > #<Complex (0 +1.7320508075688772i)> > > user=> (clojure.math/sqrt 2) > 1.4142135623730951 > > user=> (clojure.math/sqrt (complex 2 3)) > #<Complex (1.6741492280355401 +0.895977476129838i)> > > user=> (= (complex 12 34) (complex 12 34.0)) > false > user=> (== (complex 12 34) (complex 12 34.0)) > true > > I'm still not sure why #<Complex comes up, while #<Ratio doesn't with similar operations.
You need to define a custom print-method for Complex. > What also worries me a bit is that I changed a bunch of methods in Numbers.java from accepting Object to being overloaded to accept Number and Complex. My intuition here is that the "public interface" of Numbers.java always operates on Objects (essentially data with an unknown type at compile time). The methods in Numbers.java that take more specific types are for the compiler's use when optimizing, via inlining, type hinting, and intrinsics. > For example, this: > static public Number add(Object x, Object y){ > return ops(x).combine(ops(y)).add((Number)x, (Number)y); > } > > Has become: > static public Number add(Number x, Number y){ > return ops(x).combine(ops(y)).add(x, y); > } > > So that I could overload with this: > static public Object add(Complex x, Complex y) { > Number r = add(x.real, y.real); > Number im = add(x.imaginary, y.imaginary); > if (isZero(im)) > return r; > else > return new Complex(r, im); > } > > A consequence is that this test: > (is (thrown? ClassCastException (+ "ab" "cd"))) ) ; no string concatenation > Has become: > (is (thrown? IllegalArgumentException (+ "ab" "cd"))) ) ; no string concatenation > > I thought that overloading would be nicer and would avoid having to check for the class of the Object. > On the other hand all methods seem to accept an Object and then cast to Number rather than just accepting a Number, so there might be a good reason for that. > Could somebody please enlighten me on this so that I can do it the right 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 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