summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-02-10 16:51:45 -0500
committerRich Hickey <richhickey@gmail.com>2010-02-10 16:51:45 -0500
commitf612ecffe2c47fa8df2ded84b36e4137f5eb4f6d (patch)
tree09092a045e2837f369069b04e003c8035aeac0e2
parent060b311c380312caef727dfbf4ff736e0b2a2857 (diff)
inlined bit shifts, added definterface (undocumented for now)
-rw-r--r--src/clj/clojure/core.clj2
-rw-r--r--src/clj/clojure/core_deftype.clj14
-rw-r--r--src/jvm/clojure/lang/Numbers.java7
-rw-r--r--src/jvm/clojure/lang/RT.java6
4 files changed, 21 insertions, 8 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj
index 3a315e63..eb8a8fe6 100644
--- a/src/clj/clojure/core.clj
+++ b/src/clj/clojure/core.clj
@@ -948,10 +948,12 @@
(defn bit-shift-left
"Bitwise shift left"
+ {:inline (fn [x n] `(. clojure.lang.Numbers (shiftLeft ~x ~n)))}
[x n] (. clojure.lang.Numbers shiftLeft x n))
(defn bit-shift-right
"Bitwise shift right"
+ {:inline (fn [x n] `(. clojure.lang.Numbers (shiftRight ~x ~n)))}
[x n] (. clojure.lang.Numbers shiftRight x n))
(defn even?
diff --git a/src/clj/clojure/core_deftype.clj b/src/clj/clojure/core_deftype.clj
index c675a012..b3b7eef6 100644
--- a/src/clj/clojure/core_deftype.clj
+++ b/src/clj/clojure/core_deftype.clj
@@ -8,6 +8,16 @@
(in-ns 'clojure.core)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;; definterface ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;for now, built on gen-interface
+(defmacro definterface
+ [name & sigs]
+ (let [tag (fn [x] (or (:tag (meta x)) Object))
+ psig (fn [[name [& args]]]
+ (vector name (vec (map tag args)) (tag name)))]
+ `(gen-interface :name ~(symbol (str *ns* "." name)) :methods ~(vec (map psig sigs)))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;; reify/deftype ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- parse-opts [s]
@@ -36,7 +46,7 @@
methods (mapcat #(map (fn [[nm [& args] & body]]
`(~nm [~(:as opts) ~@args] ~@body)) %)
(vals impls))]
- [interfaces methods]))
+ [interfaces methods opts]))
(defmacro reify
"reify is a macro with the following structure:
@@ -269,7 +279,7 @@
[name [& fields] & opts+specs]
(let [gname (if *compile-files* name (gensym (str name "__")))
- [interfaces methods] (parse-opts+specs opts+specs)
+ [interfaces methods opts] (parse-opts+specs opts+specs)
classname (symbol (str *ns* "." gname))
tag (keyword (str *ns*) (str name))
hinted-fields fields
diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java
index 04002085..5682d581 100644
--- a/src/jvm/clojure/lang/Numbers.java
+++ b/src/jvm/clojure/lang/Numbers.java
@@ -348,10 +348,17 @@ static public Number shiftLeft(Number x, int n){
return bitOps(x).shiftLeft(x, n);
}
+static public int shiftLeft(int x, int n){
+ return x << n;
+}
+
static public Number shiftRight(Number x, int n){
return bitOps(x).shiftRight(x, n);
}
+static public int shiftRight(int x, int n){
+ return x >> n;
+}
final static class IntegerOps implements Ops{
public Ops combine(Ops y){
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 9fa16a4c..6ed98b43 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -501,12 +501,6 @@ static public IPersistentMap meta(Object x){
return null;
}
-public static int count(Counted o){
- if(o != null)
- return o.count();
- return 0;
-}
-
public static int count(Object o){
if(o instanceof Counted)
return ((Counted) o).count();