summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-05-23 21:28:12 +0000
committerRich Hickey <richhickey@gmail.com>2006-05-23 21:28:12 +0000
commitd65b16bde7ffb8caa020472cb7a88b03e128ee4f (patch)
treee6333e56dcc4f846ba413a1c8675061ed07794e1 /src
parent494fd9c97ce10cbe481e2b35eafa3c044ea093ac (diff)
made Var a Symbol in a Namespace
Diffstat (limited to 'src')
-rw-r--r--src/cli/runtime/Namespace.cs8
-rw-r--r--src/cli/runtime/Var.cs4
-rw-r--r--src/org/clojure/runtime/Namespace.java65
-rw-r--r--src/org/clojure/runtime/Var.java14
4 files changed, 47 insertions, 44 deletions
diff --git a/src/cli/runtime/Namespace.cs b/src/cli/runtime/Namespace.cs
index 3dd6eb9a..d4b15078 100644
--- a/src/cli/runtime/Namespace.cs
+++ b/src/cli/runtime/Namespace.cs
@@ -25,7 +25,7 @@ public class Namespace
static public HybridDictionary table = new HybridDictionary();
/**
- * String->Symbol
+ * Symbol->Var
*/
public HybridDictionary vars = new HybridDictionary();
public String name;
@@ -53,11 +53,11 @@ static public Namespace findOrCreate(String name)
}
}
-static public Var internVar(String ns, String var)
+static public Var intern(String ns, String name)
{
- return findOrCreate(ns).internVar(var);
+ return findOrCreate(ns).intern(Symbol.intern(name));
}
-public Var internVar(String name) { lock(vars) { Var var = (Var) vars[name]; if(var == null) vars.Add(name,var = new Var(name, this)); return var; } }
+public Var intern(Symbol sym) { lock(vars) { Var var = (Var) vars[sym]; if(var == null) vars.Add(sym,var = new Var(sym, this)); return var; } }
}
}
diff --git a/src/cli/runtime/Var.cs b/src/cli/runtime/Var.cs
index 46f96654..2e4f666c 100644
--- a/src/cli/runtime/Var.cs
+++ b/src/cli/runtime/Var.cs
@@ -12,9 +12,9 @@ using System;
namespace org.clojure.runtime
{
-public class Var : Indexer
+public class Var : AFn
{
-public String name; public Namespace ns; public Cons binding; public IFn fn; //todo, bind to throw stub? public IFn setfn; internal Var(String name, Namespace ns) { this.ns = ns; this.name = name; } public String toString() { if(ns == null) return "#:" + name; return ns.name + ":" + name; } public Var bind(Object val) { if(binding == null) binding = new Cons(val,null); else binding.first = val;
+public readonly Symbol sym; public Namespace ns; public Cons binding; public IFn fn; //todo, bind to throw stub? public IFn setfn; internal Var(Symbol sym, Namespace ns) { if(sym.GetType() != typeof(Symbol)) throw new ArgumentException("Only simple symbols can be vars"); this.ns = ns; this.sym = sym; } public String toString() { if(ns == null) return "#:" + sym; return ns.name + ":" + sym; } public Var bind(Object val) { if(binding == null) binding = new Cons(val,null); else binding.first = val;
if (val is IFn)
this.fn = (IFn)val;
diff --git a/src/org/clojure/runtime/Namespace.java b/src/org/clojure/runtime/Namespace.java
index 22b1eb9d..04a7d40e 100644
--- a/src/org/clojure/runtime/Namespace.java
+++ b/src/org/clojure/runtime/Namespace.java
@@ -13,6 +13,7 @@
package org.clojure.runtime;
import java.util.HashMap;
+import java.util.IdentityHashMap;
public class Namespace{
@@ -22,48 +23,48 @@ public class Namespace{
static final public HashMap table = new HashMap();
/**
- * String->Symbol
+ * Symbol->Var
*/
-final public HashMap vars = new HashMap();
+final public IdentityHashMap vars = new IdentityHashMap();
final public String name;
Namespace(String name)
- {
- this.name = name;
- table.put(name, this);
- }
+ {
+ this.name = name;
+ table.put(name, this);
+ }
static public Namespace find(String name)
- {
- return (Namespace) table.get(name);
- }
+ {
+ return (Namespace) table.get(name);
+ }
static public Namespace findOrCreate(String name)
- {
- synchronized(table)
- {
- Namespace ns = find(name);
- if(ns == null)
- ns = new Namespace(name);
- return ns;
- }
- }
+ {
+ synchronized(table)
+ {
+ Namespace ns = find(name);
+ if(ns == null)
+ ns = new Namespace(name);
+ return ns;
+ }
+ }
-static public Var internVar(String ns,String var)
- {
- return findOrCreate(ns).internVar(var);
- }
+static public Var intern(String ns,String name)
+ {
+ return findOrCreate(ns).intern(Symbol.intern(name));
+ }
-public Var internVar(String name)
- {
- synchronized(vars)
- {
- Var var = (Var) vars.get(name);
- if(var == null)
- vars.put(name, var = new Var(name, this));
- return var;
- }
- }
+public Var intern(Symbol sym)
+ {
+ synchronized(vars)
+ {
+ Var var = (Var) vars.get(sym);
+ if(var == null)
+ vars.put(sym, var = new Var(sym, this));
+ return var;
+ }
+ }
}
diff --git a/src/org/clojure/runtime/Var.java b/src/org/clojure/runtime/Var.java
index a328ceb4..fce5344f 100644
--- a/src/org/clojure/runtime/Var.java
+++ b/src/org/clojure/runtime/Var.java
@@ -14,23 +14,25 @@ package org.clojure.runtime;
public class Var extends AFn{
-public final String name;
+public final Symbol sym;
public Namespace namespace;
public Cons binding;
public IFn fn; //todo, bind to throw stub?
public IFn setfn;
-Var(String name, Namespace ns)
+Var(Symbol sym, Namespace ns)
{
- this.namespace = ns;
- this.name = name;
+ if(!(sym.getClass() == Symbol.class))
+ throw new IllegalArgumentException("Only simple symbols can be vars");
+ this.namespace = ns;
+ this.sym = sym;
}
public String toString()
{
if(namespace == null)
- return "#:" + name;
- return namespace.name + ":" + name;
+ return "#:" + sym;
+ return namespace.name + ":" + sym;
}
public Var bind(Object val)