diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-20 16:31:21 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-20 16:31:21 +0000 |
commit | 98cf7e1cab10a3208c0b60611e9b2b533fbc0eea (patch) | |
tree | 5a2474af62aba31ac6816fd51783d153b430afe6 /src | |
parent | 38448abc221eb994127b539b358a7d01232d0b0d (diff) |
doc update, added bindings macro, Named
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 19 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Keyword.java | 10 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Named.java | 19 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Symbol.java | 14 |
4 files changed, 58 insertions, 4 deletions
diff --git a/src/boot.clj b/src/boot.clj index c711e27a..0e6873f1 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -238,6 +238,12 @@ (defn rseq [smap] (. smap (rseq))) +(defn name [#^clojure.lang.Named x] + (. x (getName))) + +(defn namespace [#^clojure.lang.Named x] + (. x (getNamespace))) + (defn andfn [& args] (if (nil? (rest args)) (first args) @@ -269,3 +275,16 @@ `(let [~pvar (the-var ~polyfn)] (locking ~pvar (. ~pvar (bindRoot (.. ~pvar (getRoot) (assoc ~dispatch-val (fn ~@fn-tail))))))))) + +(defmacro binding [bindings & body] + (let [var-ize (fn [var-vals] + (loop [ret [] vvs (seq var-vals)] + (if vvs + (recur (conj (conj ret `(the-var ~(first vvs))) (second vvs)) + (rest (rest vvs))) + (seq ret))))] + `(try-finally + (do + (. Var (pushThreadBindings (hash-map ~@(var-ize bindings)))) + ~@body) + (. Var (popThreadBindings))))) diff --git a/src/jvm/clojure/lang/Keyword.java b/src/jvm/clojure/lang/Keyword.java index 479a9b2f..2936949d 100644 --- a/src/jvm/clojure/lang/Keyword.java +++ b/src/jvm/clojure/lang/Keyword.java @@ -15,7 +15,7 @@ package clojure.lang; import java.util.concurrent.ConcurrentHashMap; -public class Keyword implements IFn, Comparable{ +public class Keyword implements IFn, Comparable, Named{ private static ConcurrentHashMap<Symbol, Keyword> table = new ConcurrentHashMap(); public final Symbol sym; @@ -51,6 +51,14 @@ public int compareTo(Object o){ } +public String getNamespace(){ + return sym.getNamespace(); +} + +public String getName(){ + return sym.getName(); +} + /** * Indexer implements IFn for attr access * diff --git a/src/jvm/clojure/lang/Named.java b/src/jvm/clojure/lang/Named.java new file mode 100644 index 00000000..bc35e1cc --- /dev/null +++ b/src/jvm/clojure/lang/Named.java @@ -0,0 +1,19 @@ +/** + * Copyright (c) Rich Hickey. All rights reserved. + * The use and distribution terms for this software are covered by the + * Common Public License 1.0 (http://opensource.org/licenses/cpl.php) + * which can be found in the file CPL.TXT at the root of this distribution. + * By using this software in any fashion, you are agreeing to be bound by + * the terms of this license. + * You must not remove this notice, or any other, from this software. + **/ + +/* rich Sep 20, 2007 */ + +package clojure.lang; + +public interface Named{ +String getNamespace(); + +String getName(); +} diff --git a/src/jvm/clojure/lang/Symbol.java b/src/jvm/clojure/lang/Symbol.java index dcbce7b2..6fb774b1 100644 --- a/src/jvm/clojure/lang/Symbol.java +++ b/src/jvm/clojure/lang/Symbol.java @@ -13,10 +13,10 @@ package clojure.lang; -public class Symbol extends Obj implements Comparable{ +public class Symbol extends Obj implements Comparable, Named{ //these must be interned strings! -public final String ns; -public final String name; +final String ns; +final String name; final int hash; public String toString(){ @@ -25,6 +25,14 @@ public String toString(){ return name; } +public String getNamespace(){ + return ns; +} + +public String getName(){ + return name; +} + static public Symbol intern(String ns, String name){ return new Symbol(ns == null ? null : ns.intern(), name.intern()); } |