summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-04-07 23:44:07 +0000
committerRich Hickey <richhickey@gmail.com>2008-04-07 23:44:07 +0000
commit0fc313a3ee8a6bcf71b13122cc24d0c221b77135 (patch)
treed31c8062ca5a5aff9f2da4cd661a2754d9637d63 /src/jvm/clojure
parent2391006b61f59fc4e9b60befce05d45a19dcec11 (diff)
new numbers - all Num derivees should be not-in-use, all numbers are Java's boxed Numbers, + Ratio, added support for BigDecimal
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/BigNum.java2
-rw-r--r--src/jvm/clojure/lang/Compiler.java2
-rw-r--r--src/jvm/clojure/lang/DoubleNum.java2
-rw-r--r--src/jvm/clojure/lang/FixNum.java2
-rw-r--r--src/jvm/clojure/lang/FloatNum.java2
-rw-r--r--src/jvm/clojure/lang/IntegerNum.java2
-rw-r--r--src/jvm/clojure/lang/LispReader.java8
-rw-r--r--src/jvm/clojure/lang/Num.java2
-rw-r--r--src/jvm/clojure/lang/Numbers.java27
-rw-r--r--src/jvm/clojure/lang/RT.java26
-rw-r--r--src/jvm/clojure/lang/RatioNum.java2
-rw-r--r--src/jvm/clojure/lang/RationalNum.java2
-rw-r--r--src/jvm/clojure/lang/RealNum.java2
13 files changed, 48 insertions, 33 deletions
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 {
}