diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-02-10 16:51:45 -0500 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-02-10 16:51:45 -0500 |
commit | f612ecffe2c47fa8df2ded84b36e4137f5eb4f6d (patch) | |
tree | 09092a045e2837f369069b04e003c8035aeac0e2 | |
parent | 060b311c380312caef727dfbf4ff736e0b2a2857 (diff) |
inlined bit shifts, added definterface (undocumented for now)
-rw-r--r-- | src/clj/clojure/core.clj | 2 | ||||
-rw-r--r-- | src/clj/clojure/core_deftype.clj | 14 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Numbers.java | 7 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 6 |
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(); |