summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-20 16:31:21 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-20 16:31:21 +0000
commit98cf7e1cab10a3208c0b60611e9b2b533fbc0eea (patch)
tree5a2474af62aba31ac6816fd51783d153b430afe6 /src
parent38448abc221eb994127b539b358a7d01232d0b0d (diff)
doc update, added bindings macro, Named
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj19
-rw-r--r--src/jvm/clojure/lang/Keyword.java10
-rw-r--r--src/jvm/clojure/lang/Named.java19
-rw-r--r--src/jvm/clojure/lang/Symbol.java14
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());
}