summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Dipert <alan@dipert.org>2011-05-09 22:33:20 -0400
committerStuart Halloway <stu@thinkrelevance.com>2011-05-13 13:33:04 -0400
commit8f0c737b228e1b74ad7cdda0936d1a53e4b592e6 (patch)
tree9a17cecdeb1c001cf286d38f0c70240c1f4f9143
parent507e7b93062cecb52a677aa34357237b770beb42 (diff)
inlining and n-ary bit functions and math ops - n-ary versions and inlines of bit-and, bit-or, bit-xor, bit-and-not - n-ary inlines for +, +', *, *', /, -, -'
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r--src/clj/clojure/core.clj74
1 files changed, 52 insertions, 22 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 32a1c55b..eb55a666 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -887,11 +887,28 @@
(reduce1 conj () coll))
;;math stuff
+(defn ^:private nary-inline
+ ([op]
+ (fn
+ ([x] `(. clojure.lang.Numbers (~op ~x)))
+ ([x y] `(. clojure.lang.Numbers (~op ~x ~y)))
+ ([x y & more]
+ (reduce1
+ (fn [a b] `(. clojure.lang.Numbers (~op ~a ~b)))
+ `(. clojure.lang.Numbers (~op ~x ~y)) more))))
+ ([op unchecked-op]
+ (if *unchecked-math*
+ (nary-inline unchecked-op)
+ (nary-inline op))))
+
+(defn ^:private >1? [n] (clojure.lang.Numbers/gt n 1))
+(defn ^:private >0? [n] (clojure.lang.Numbers/gt n 0))
+
(defn +'
"Returns the sum of nums. (+) returns 0. Supports arbitrary precision.
See also: +"
- {:inline (fn [x y] `(. clojure.lang.Numbers (addP ~x ~y)))
- :inline-arities #{2}
+ {:inline (nary-inline 'addP)
+ :inline-arities >1?
:added "1.0"}
([] 0)
([x] (cast Number x))
@@ -902,8 +919,8 @@
(defn +
"Returns the sum of nums. (+) returns 0. Does not auto-promote
longs, will throw on overflow. See also: +'"
- {:inline (fn [x y] `(. clojure.lang.Numbers (~(if *unchecked-math* 'unchecked_add 'add) ~x ~y)))
- :inline-arities #{2}
+ {:inline (nary-inline 'add 'unchecked_add)
+ :inline-arities >1?
:added "1.2"}
([] 0)
([x] (cast Number x))
@@ -914,8 +931,8 @@
(defn *'
"Returns the product of nums. (*) returns 1. Supports arbitrary precision.
See also: *"
- {:inline (fn [x y] `(. clojure.lang.Numbers (multiplyP ~x ~y)))
- :inline-arities #{2}
+ {:inline (nary-inline 'multiplyP)
+ :inline-arities >1?
:added "1.0"}
([] 1)
([x] (cast Number x))
@@ -926,8 +943,8 @@
(defn *
"Returns the product of nums. (*) returns 1. Does not auto-promote
longs, will throw on overflow. See also: *'"
- {:inline (fn [x y] `(. clojure.lang.Numbers (~(if *unchecked-math* 'unchecked_multiply 'multiply) ~x ~y)))
- :inline-arities #{2}
+ {:inline (nary-inline 'multiply 'unchecked_multiply)
+ :inline-arities >1?
:added "1.2"}
([] 1)
([x] (cast Number x))
@@ -938,8 +955,8 @@
(defn /
"If no denominators are supplied, returns 1/numerator,
else returns numerator divided by all of the denominators."
- {:inline (fn [x y] `(. clojure.lang.Numbers (divide ~x ~y)))
- :inline-arities #{2}
+ {:inline (nary-inline 'divide)
+ :inline-arities >1?
:added "1.0"}
([x] (/ 1 x))
([x y] (. clojure.lang.Numbers (divide x y)))
@@ -950,8 +967,8 @@
"If no ys are supplied, returns the negation of x, else subtracts
the ys from x and returns the result. Supports arbitrary precision.
See also: -"
- {:inline (fn [& args] `(. clojure.lang.Numbers (minusP ~@args)))
- :inline-arities #{1 2}
+ {:inline (nary-inline 'minusP)
+ :inline-arities >0?
:added "1.0"}
([x] (. clojure.lang.Numbers (minusP x)))
([x y] (. clojure.lang.Numbers (minusP x y)))
@@ -962,8 +979,8 @@
"If no ys are supplied, returns the negation of x, else subtracts
the ys from x and returns the result. Does not auto-promote
longs, will throw on overflow. See also: -'"
- {:inline (fn [& args] `(. clojure.lang.Numbers (~(if *unchecked-math* 'unchecked_minus 'minus) ~@args)))
- :inline-arities #{1 2}
+ {:inline (nary-inline 'minus 'unchecked_minus)
+ :inline-arities >0?
:added "1.2"}
([x] (. clojure.lang.Numbers (minus x)))
([x y] (. clojure.lang.Numbers (minus x y)))
@@ -1210,27 +1227,40 @@
(defn bit-and
"Bitwise and"
- {:inline (fn [x y] `(. clojure.lang.Numbers (and ~x ~y)))
+ {:inline (nary-inline 'and)
+ :inline-arities >1?
:added "1.0"}
- [x y] (. clojure.lang.Numbers and x y))
+ ([x y] (. clojure.lang.Numbers and x y))
+ ([x y & more]
+ (reduce1 bit-and (bit-and x y) more)))
(defn bit-or
"Bitwise or"
- {:inline (fn [x y] `(. clojure.lang.Numbers (or ~x ~y)))
+ {:inline (nary-inline 'or)
+ :inline-arities >1?
:added "1.0"}
- [x y] (. clojure.lang.Numbers or x y))
+ ([x y] (. clojure.lang.Numbers or x y))
+ ([x y & more]
+ (reduce1 bit-or (bit-or x y) more)))
(defn bit-xor
"Bitwise exclusive or"
- {:inline (fn [x y] `(. clojure.lang.Numbers (xor ~x ~y)))
+ {:inline (nary-inline 'xor)
+ :inline-arities >1?
:added "1.0"}
- [x y] (. clojure.lang.Numbers xor x y))
+ ([x y] (. clojure.lang.Numbers xor x y))
+ ([x y & more]
+ (reduce1 bit-xor (bit-xor x y) more)))
(defn bit-and-not
"Bitwise and with complement"
- {:added "1.0"
+ {:inline (nary-inline 'andNot)
+ :inline-arities >1?
+ :added "1.0"
:static true}
- [x y] (. clojure.lang.Numbers andNot x y))
+ ([x y] (. clojure.lang.Numbers andNot x y))
+ ([x y & more]
+ (reduce1 bit-and-not (bit-and-not x y) more)))
(defn bit-clear