summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/boot.clj34
-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
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 {
}