diff options
-rw-r--r-- | src/cli/runtime/Namespace.cs | 8 | ||||
-rw-r--r-- | src/cli/runtime/Var.cs | 4 | ||||
-rw-r--r-- | src/org/clojure/runtime/Namespace.java | 65 | ||||
-rw-r--r-- | src/org/clojure/runtime/Var.java | 14 |
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) |