diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 34 | ||||
-rw-r--r-- | src/jvm/clojure/lang/BigNum.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/DoubleNum.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/FixNum.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/FloatNum.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/IntegerNum.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Num.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Numbers.java | 27 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 26 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RatioNum.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RationalNum.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RealNum.java | 2 |
14 files changed, 65 insertions, 50 deletions
diff --git a/src/boot.clj b/src/boot.clj index a0bd71ae..977e9c7e 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -460,7 +460,7 @@ "Returns the sum of nums. (+) returns 0." ([] 0) ([x] (cast Number x)) - ([x y] (. clojure.lang.Num (add x y))) + ([x y] (. clojure.lang.Numbers (add x y))) ([x y & more] (reduce + (+ x y) more))) @@ -468,7 +468,7 @@ "Returns the product of nums. (*) returns 1." ([] 1) ([x] (cast Number x)) - ([x y] (. clojure.lang.Num (multiply x y))) + ([x y] (. clojure.lang.Numbers (multiply x y))) ([x y & more] (reduce * (* x y) more))) @@ -476,15 +476,15 @@ "If no denominators are supplied, returns 1/numerator, else returns numerator divided by all of the denominators." ([x] (/ 1 x)) - ([x y] (. clojure.lang.Num (divide x y))) + ([x y] (. clojure.lang.Numbers (divide x y))) ([x y & more] (reduce / (/ x y) more))) (defn - "If no ys are supplied, returns the negation of x, else subtracts the ys from x and returns the result." - ([x] (. clojure.lang.Num (negate x))) - ([x y] (. clojure.lang.Num (subtract x y))) + ([x] (. clojure.lang.Numbers (negate x))) + ([x y] (. clojure.lang.Numbers (subtract x y))) ([x y & more] (reduce - (- x y) more))) @@ -492,7 +492,7 @@ "Returns non-nil if nums are in monotonically increasing order, otherwise false." ([x] true) - ([x y] (. clojure.lang.Num (lt x y))) + ([x y] (. clojure.lang.Numbers (lt x y))) ([x y & more] (if (< x y) (if (rest more) @@ -504,7 +504,7 @@ "Returns non-nil if nums are in monotonically non-decreasing order, otherwise false." ([x] true) - ([x y] (. clojure.lang.Num (lte x y))) + ([x y] (. clojure.lang.Numbers (lte x y))) ([x y & more] (if (<= x y) (if (rest more) @@ -516,7 +516,7 @@ "Returns non-nil if nums are in monotonically decreasing order, otherwise false." ([x] true) - ([x y] (. clojure.lang.Num (gt x y))) + ([x y] (. clojure.lang.Numbers (gt x y))) ([x y & more] (if (> x y) (if (rest more) @@ -528,7 +528,7 @@ "Returns non-nil if nums are in monotonically non-increasing order, otherwise false." ([x] true) - ([x y] (. clojure.lang.Num (gte x y))) + ([x y] (. clojure.lang.Numbers (gte x y))) ([x y & more] (if (>= x y) (if (rest more) @@ -539,7 +539,7 @@ (defn == "Returns non-nil if nums all have the same value, otherwise false" ([x] true) - ([x y] (. clojure.lang.Num (equiv x y))) + ([x y] (. clojure.lang.Numbers (equiv x y))) ([x y & more] (if (== x y) (if (rest more) @@ -563,36 +563,36 @@ (defn inc "Returns a number one greater than num." - [x] (. clojure.lang.Num (inc x))) + [x] (. clojure.lang.Numbers (inc x))) (defn dec "Returns a number one less than num." - [x] (. clojure.lang.Num (dec x))) + [x] (. clojure.lang.Numbers (dec x))) (defn pos? "Returns true if num is greater than zero, else false" {:tag Boolean} - [x] (. clojure.lang.Num (posPred x))) + [x] (. clojure.lang.Numbers (isPos x))) (defn neg? "Returns true if num is less than zero, else false" {:tag Boolean} - [x] (. clojure.lang.Num (negPred x))) + [x] (. clojure.lang.Numbers (isNeg x))) (defn zero? "Returns true if num is zero, else false" {:tag Boolean} - [x] (. clojure.lang.Num (zeroPred x))) + [x] (. clojure.lang.Numbers (isZero x))) (defn quot "quot[ient] of dividing numerator by denominator." [num div] - (. clojure.lang.Num (quotient num div))) + (. clojure.lang.Numbers (quotient num div))) (defn rem "rem[ainder] of dividing numerator by denominator." [num div] - (. clojure.lang.Num (remainder num div))) + (. clojure.lang.Numbers (remainder num div))) ;;Bit ops diff --git a/src/jvm/clojure/lang/BigNum.java b/src/jvm/clojure/lang/BigNum.java index d159335c..5a440059 100644 --- a/src/jvm/clojure/lang/BigNum.java +++ b/src/jvm/clojure/lang/BigNum.java @@ -14,7 +14,7 @@ package clojure.lang; import java.math.BigInteger; -public class BigNum extends IntegerNum{ +class BigNum extends IntegerNum{ public BigInteger val; public boolean equals(Object arg0){ diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 2dcfd698..e1dc0d01 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -109,7 +109,7 @@ private static final Type OBJECT_TYPE; private static final Type KEYWORD_TYPE = Type.getType(Keyword.class); private static final Type VAR_TYPE = Type.getType(Var.class); private static final Type SYMBOL_TYPE = Type.getType(Symbol.class); -private static final Type NUM_TYPE = Type.getType(Num.class); +//private static final Type NUM_TYPE = Type.getType(Num.class); private static final Type IFN_TYPE = Type.getType(IFn.class); private static final Type RT_TYPE = Type.getType(RT.class); final static Type CLASS_TYPE = Type.getType(Class.class); diff --git a/src/jvm/clojure/lang/DoubleNum.java b/src/jvm/clojure/lang/DoubleNum.java index ee7a9507..f0e5e1c6 100644 --- a/src/jvm/clojure/lang/DoubleNum.java +++ b/src/jvm/clojure/lang/DoubleNum.java @@ -15,7 +15,7 @@ package clojure.lang; import java.math.BigInteger; import java.math.BigDecimal; -public class DoubleNum extends FloatNum{ +class DoubleNum extends FloatNum{ double val; public DoubleNum(double val){ diff --git a/src/jvm/clojure/lang/FixNum.java b/src/jvm/clojure/lang/FixNum.java index 4789dfea..b8cf7a6a 100644 --- a/src/jvm/clojure/lang/FixNum.java +++ b/src/jvm/clojure/lang/FixNum.java @@ -14,7 +14,7 @@ package clojure.lang; import java.math.BigInteger; -public class FixNum extends IntegerNum{ +class FixNum extends IntegerNum{ public int val; public boolean equals(Object arg0){ diff --git a/src/jvm/clojure/lang/FloatNum.java b/src/jvm/clojure/lang/FloatNum.java index 2e9f81e5..8725b5de 100644 --- a/src/jvm/clojure/lang/FloatNum.java +++ b/src/jvm/clojure/lang/FloatNum.java @@ -12,6 +12,6 @@ package clojure.lang; -public abstract class FloatNum extends RealNum { +abstract class FloatNum extends RealNum { } diff --git a/src/jvm/clojure/lang/IntegerNum.java b/src/jvm/clojure/lang/IntegerNum.java index 937c3356..b931d18c 100644 --- a/src/jvm/clojure/lang/IntegerNum.java +++ b/src/jvm/clojure/lang/IntegerNum.java @@ -14,7 +14,7 @@ package clojure.lang; import java.math.BigInteger; -public abstract class IntegerNum extends RationalNum{ +abstract class IntegerNum extends RationalNum{ static public Num bitXor(Object x, Object y){ return ((IntegerNum) Num.from(y)).bitXorBy((IntegerNum) Num.from(x)); } diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index 32d1af56..0567cffe 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -242,14 +242,14 @@ private static Object matchSymbol(String s){ private static Object matchNumber(String s){
Matcher m = intPat.matcher(s);
if(m.matches())
- return Num.from(new BigInteger(s));
+ return Numbers.reduce(new BigInteger(s));
m = floatPat.matcher(s);
if(m.matches())
- return Num.from(Double.parseDouble(s));
+ return Double.parseDouble(s);
m = ratioPat.matcher(s);
if(m.matches())
{
- return Num.divide(new BigInteger(m.group(1)), new BigInteger(m.group(2)));
+ return Numbers.divide(new BigInteger(m.group(1)), new BigInteger(m.group(2)));
}
return null;
}
@@ -555,7 +555,7 @@ static class SyntaxQuoteReader extends AFn{ throw new UnsupportedOperationException("Unknown Collection type");
}
else if(form instanceof Keyword
- || form instanceof Num
+ || form instanceof Number
|| form instanceof Character
|| form instanceof String)
ret = form;
diff --git a/src/jvm/clojure/lang/Num.java b/src/jvm/clojure/lang/Num.java index 71596329..30f72acd 100644 --- a/src/jvm/clojure/lang/Num.java +++ b/src/jvm/clojure/lang/Num.java @@ -14,7 +14,7 @@ package clojure.lang; import java.math.BigInteger; -public abstract class Num extends Number implements Comparable{ +abstract class Num extends Number implements Comparable{ public final static Num ZERO = from(0); public final static Num ONE = from(1); diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java index d40cc70e..9ae8e06c 100644 --- a/src/jvm/clojure/lang/Numbers.java +++ b/src/jvm/clojure/lang/Numbers.java @@ -123,6 +123,11 @@ static Number remainder(double n, double d){ } } +static public boolean equiv(Object x, Object y){ + return y instanceof Number && x instanceof Number + && equiv((Number) x, (Number) y); + } + static public boolean equiv(Number x, Number y){ return ops(x).combine(ops(y)).equiv(x, y); } @@ -131,10 +136,18 @@ static public boolean lt(Number x, Number y){ return ops(x).combine(ops(y)).lt(x, y); } +static public boolean lte(Number x, Number y){ + return !ops(x).combine(ops(y)).lt(y, x); +} + static public boolean gt(Number x, Number y){ return ops(x).combine(ops(y)).lt(y, x); } +static public boolean gte(Number x, Number y){ + return !ops(x).combine(ops(y)).lt(x, y); +} + static public int compare(Number x, Number y){ Ops ops = ops(x).combine(ops(y)); if(ops.lt(x,y)) @@ -540,17 +553,17 @@ final static class BigIntegerOps implements Ops{ final public Ops opsWith(BigDecimalOps x){return BIGDECIMAL_OPS;} public boolean isZero(Number x){ - BigInteger bx = (BigInteger) x; + BigInteger bx = toBigInteger(x); return bx.signum() == 0; } public boolean isPos(Number x){ - BigInteger bx = (BigInteger) x; + BigInteger bx = toBigInteger(x); return bx.signum() > 0; } public boolean isNeg(Number x){ - BigInteger bx = (BigInteger) x; + BigInteger bx = toBigInteger(x); return bx.signum() < 0; } @@ -584,16 +597,16 @@ final static class BigIntegerOps implements Ops{ //public Number subtract(Number x, Number y); final public Number negate(Number x){ - return ((BigInteger)x).negate(); + return toBigInteger(x).negate(); } public Number inc(Number x){ - BigInteger bx = (BigInteger) x; + BigInteger bx = toBigInteger(x); return reduce(bx.add(BigInteger.ONE)); } public Number dec(Number x){ - BigInteger bx = (BigInteger) x; + BigInteger bx = toBigInteger(x); return reduce(bx.subtract(BigInteger.ONE)); } } @@ -687,6 +700,8 @@ static Ops ops(Object x){ return FLOAT_OPS; else if(xc == BigInteger.class) return BIGINTEGER_OPS; + else if(xc == Long.class) + return BIGINTEGER_OPS; else if(xc == Ratio.class) return RATIO_OPS; else if(xc == BigDecimal.class) diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 3053b574..3189d53f 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -270,7 +270,7 @@ static public boolean equal(Object k1, Object k2){ if(k1 != null) { if(k1 instanceof Number) - return Num.equiv(k1, k2); + return Numbers.equiv(k1, k2); return k1.equals(k2); } return false; @@ -615,28 +615,28 @@ static public Object box(Boolean x){ return x;// ? T : null; } -static public Num box(byte x){ - return Num.from(x); +static public Number box(byte x){ + return x;//Num.from(x); } -static public Num box(short x){ - return Num.from(x); +static public Number box(short x){ + return x;//Num.from(x); } -static public Num box(int x){ - return Num.from(x); +static public Number box(int x){ + return x;//Num.from(x); } -static public Num box(long x){ - return Num.from(x); +static public Number box(long x){ + return x;//Num.from(x); } -static public Num box(float x){ - return Num.from(x); +static public Number box(float x){ + return x;//Num.from(x); } -static public Num box(double x){ - return Num.from(x); +static public Number box(double x){ + return x;//Num.from(x); } static public char charCast(Object x){ diff --git a/src/jvm/clojure/lang/RatioNum.java b/src/jvm/clojure/lang/RatioNum.java index 50524f02..63630032 100644 --- a/src/jvm/clojure/lang/RatioNum.java +++ b/src/jvm/clojure/lang/RatioNum.java @@ -14,7 +14,7 @@ package clojure.lang; import java.math.BigInteger; -public class RatioNum extends RationalNum{ +class RatioNum extends RationalNum{ public boolean equals(Object arg0){ return arg0 != null && arg0 instanceof RatioNum diff --git a/src/jvm/clojure/lang/RationalNum.java b/src/jvm/clojure/lang/RationalNum.java index f36b0c48..b87ca874 100644 --- a/src/jvm/clojure/lang/RationalNum.java +++ b/src/jvm/clojure/lang/RationalNum.java @@ -12,6 +12,6 @@ package clojure.lang; -public abstract class RationalNum extends RealNum { +abstract class RationalNum extends RealNum { } diff --git a/src/jvm/clojure/lang/RealNum.java b/src/jvm/clojure/lang/RealNum.java index e5a55e8d..01a87448 100644 --- a/src/jvm/clojure/lang/RealNum.java +++ b/src/jvm/clojure/lang/RealNum.java @@ -12,6 +12,6 @@ package clojure.lang; -public abstract class RealNum extends Num { +abstract class RealNum extends Num { } |