diff options
-rw-r--r-- | src/boot.clj | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/BigNum.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/DoubleNum.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/FixNum.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Num.java | 20 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RatioNum.java | 14 |
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)); } |