summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj8
-rw-r--r--src/jvm/clojure/lang/BigNum.java10
-rw-r--r--src/jvm/clojure/lang/DoubleNum.java10
-rw-r--r--src/jvm/clojure/lang/FixNum.java10
-rw-r--r--src/jvm/clojure/lang/Num.java20
-rw-r--r--src/jvm/clojure/lang/RT.java4
-rw-r--r--src/jvm/clojure/lang/RatioNum.java14
7 files changed, 45 insertions, 31 deletions
diff --git a/src/boot.clj b/src/boot.clj
index ff9a0b65..d5e21f13 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -230,6 +230,12 @@
(defn zero? [x]
(. clojure.lang.Num (zeroPred x)))
+(defn quot [num div]
+ (. clojure.lang.Num (quotient num div)))
+
+(defn rem [num div]
+ (. clojure.lang.Num (remainder num div)))
+
(defn complement [f]
(fn [& args]
(not (apply f args))))
@@ -765,7 +771,7 @@
eql? str strcat gensym cond
apply list* delay lazy-cons fnseq concat
and or + * / - == < <= > >=
- inc dec pos? neg? zero?
+ inc dec pos? neg? zero? quot rem
complement constantly identity seq count
peek pop nth contains get
assoc dissoc find keys vals merge
diff --git a/src/jvm/clojure/lang/BigNum.java b/src/jvm/clojure/lang/BigNum.java
index aaa862d1..3d0e9091 100644
--- a/src/jvm/clojure/lang/BigNum.java
+++ b/src/jvm/clojure/lang/BigNum.java
@@ -141,20 +141,20 @@ public Num divide(RatioNum x){
return Num.divide(x.numerator, x.denominator.multiply(val));
}
-public Object truncateDivide(Num num){
+public Object[] truncateDivide(Num num){
return num.truncateBy(val);
}
-public Object truncateBy(int div){
+public Object[] truncateBy(int div){
return Num.truncateBigints(val, BigInteger.valueOf(div));
}
-public Object truncateBy(BigInteger div){
+public Object[] truncateBy(BigInteger div){
return Num.truncateBigints(val, div);
}
-public Object truncateBy(RatioNum div){
- Num q = (Num) Num.truncate(div.denominator.multiply(val), div.numerator);
+public Object[] truncateBy(RatioNum div){
+ Num q = (Num) Num.truncate(div.denominator.multiply(val), div.numerator)[0];
return RT.setValues(q, q.multiplyBy(div).subtractFrom(this));
}
diff --git a/src/jvm/clojure/lang/DoubleNum.java b/src/jvm/clojure/lang/DoubleNum.java
index 3e19e9ac..ee7a9507 100644
--- a/src/jvm/clojure/lang/DoubleNum.java
+++ b/src/jvm/clojure/lang/DoubleNum.java
@@ -133,7 +133,7 @@ public Num divide(RatioNum x){
return Num.from(x.doubleValue() / val);
}
-static Object truncate(double n, double d){
+static Object[] truncate(double n, double d){
double q = n / d;
if(q <= Integer.MAX_VALUE && q >= Integer.MIN_VALUE)
{
@@ -148,19 +148,19 @@ static Object truncate(double n, double d){
}
}
-public Object truncateBy(BigInteger x){
+public Object[] truncateBy(BigInteger x){
return truncate(val, x.doubleValue());
}
-public Object truncateBy(int x){
+public Object[] truncateBy(int x){
return truncate(val, x);
}
-public Object truncateBy(RatioNum x){
+public Object[] truncateBy(RatioNum x){
return truncate(val, x.doubleValue());
}
-public Object truncateDivide(Num num){
+public Object[] truncateDivide(Num num){
return truncate(num.doubleValue(), val);
}
diff --git a/src/jvm/clojure/lang/FixNum.java b/src/jvm/clojure/lang/FixNum.java
index 99ef0ce6..3f784b21 100644
--- a/src/jvm/clojure/lang/FixNum.java
+++ b/src/jvm/clojure/lang/FixNum.java
@@ -121,20 +121,20 @@ public Num multiply(RatioNum x){
return x.multiply(val);
}
-public Object truncateDivide(Num num){
+public Object[] truncateDivide(Num num){
return num.truncateBy(val);
}
-public Object truncateBy(int div){
+public Object[] truncateBy(int div){
return RT.setValues(Num.from(val / div), Num.from(val % div));
}
-public Object truncateBy(BigInteger div){
+public Object[] truncateBy(BigInteger div){
return Num.truncateBigints(BigInteger.valueOf(val), div);
}
-public Object truncateBy(RatioNum div){
- Num q = (Num) Num.truncate(div.denominator.multiply(val), div.numerator);
+public Object[] truncateBy(RatioNum div){
+ Num q = (Num) Num.truncate(div.denominator.multiply(val), div.numerator)[0];
return RT.setValues(q, q.multiplyBy(div).subtractFrom(this));
}
diff --git a/src/jvm/clojure/lang/Num.java b/src/jvm/clojure/lang/Num.java
index 31cadb32..3aa5f3b1 100644
--- a/src/jvm/clojure/lang/Num.java
+++ b/src/jvm/clojure/lang/Num.java
@@ -106,19 +106,27 @@ abstract public Num divide(BigInteger x);
abstract public Num divide(RatioNum x);
-static public Object truncate(Object num, Object div){
+static public Object[] truncate(Object num, Object div){
return Num.from(div).truncateDivide(Num.from(num));
}
-abstract public Object truncateDivide(Num rhs);
+static public Object quotient(Object num, Object div){
+ return truncate(num,div)[0];
+}
+
+static public Object remainder(Object num, Object div){
+ return truncate(num,div)[1];
+}
+
+abstract public Object[] truncateDivide(Num rhs);
-abstract public Object truncateBy(int x);
+abstract public Object[] truncateBy(int x);
-abstract public Object truncateBy(BigInteger x);
+abstract public Object[] truncateBy(BigInteger x);
-abstract public Object truncateBy(RatioNum x);
+abstract public Object[] truncateBy(RatioNum x);
-static public Object truncateBigints(BigInteger n, BigInteger d){
+static public Object[] truncateBigints(BigInteger n, BigInteger d){
BigInteger[] result = n.divideAndRemainder(d);
return RT.setValues(Num.from(result[0]), Num.from(result[1]));
}
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 78156532..61d324a7 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -858,10 +858,10 @@ static public ISeq doFormat(Writer w, String s, ISeq args) throws Exception{
}
///////////////////////////////// values //////////////////////////
-static public Object setValues(Object... vals){
+static public Object[] setValues(Object... vals){
//ThreadLocalData.setValues(vals);
if(vals.length > 0)
- return vals[0];
+ return vals;//[0];
return null;
}
diff --git a/src/jvm/clojure/lang/RatioNum.java b/src/jvm/clojure/lang/RatioNum.java
index e91e74c9..50524f02 100644
--- a/src/jvm/clojure/lang/RatioNum.java
+++ b/src/jvm/clojure/lang/RatioNum.java
@@ -143,23 +143,23 @@ public Num divide(RatioNum n){
}
-public Object truncateDivide(Num num){
+public Object[] truncateDivide(Num num){
return num.truncateBy(this);
}
-public Object truncateBy(int div){
- Num q = (Num) Num.truncate(numerator, denominator.multiply(div));
+public Object[] truncateBy(int div){
+ Num q = (Num) Num.truncate(numerator, denominator.multiply(div))[0];
return RT.setValues(q, q.multiply(div).subtractFrom(this));
}
-public Object truncateBy(BigInteger div){
- Num q = (Num) Num.truncate(numerator, denominator.multiply(div));
+public Object[] truncateBy(BigInteger div){
+ Num q = (Num) Num.truncate(numerator, denominator.multiply(div))[0];
return RT.setValues(q, q.multiply(div).subtractFrom(this));
}
-public Object truncateBy(RatioNum div){
+public Object[] truncateBy(RatioNum div){
Num q = (Num) Num.truncate(numerator.multiplyBy(div.denominator),
- denominator.multiplyBy(div.numerator));
+ denominator.multiplyBy(div.numerator))[0];
return RT.setValues(q, q.multiplyBy(div).subtractFrom(this));
}