summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cli/runtime/Cons.cs4
-rw-r--r--src/cli/runtime/Var.cs8
-rw-r--r--src/org/clojure/runtime/Cons.java4
-rw-r--r--src/org/clojure/runtime/Var.java34
4 files changed, 25 insertions, 25 deletions
diff --git a/src/cli/runtime/Cons.cs b/src/cli/runtime/Cons.cs
index 331e3073..02e20202 100644
--- a/src/cli/runtime/Cons.cs
+++ b/src/cli/runtime/Cons.cs
@@ -18,8 +18,8 @@ namespace org.clojure.runtime
public class Cons : AMap,Iter
{
-public Object first;
-public Cons rest;
+public readonly Object first;
+public readonly Cons rest;
public Cons(Object first, Cons rest)
{
diff --git a/src/cli/runtime/Var.cs b/src/cli/runtime/Var.cs
index 2e4f666c..7354a5ed 100644
--- a/src/cli/runtime/Var.cs
+++ b/src/cli/runtime/Var.cs
@@ -14,12 +14,12 @@ namespace org.clojure.runtime
{
public class Var : AFn
{
-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;
+public readonly Symbol sym; public Namespace ns; public Box 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 Box(val); else binding.val = val;
if (val is IFn)
this.fn = (IFn)val;
else
- this.fn = null; //todo, bind to throw stub? return this; } public Cons getBinding(ThreadLocalData tld) { Cons b = getDynamicBinding(tld); if(b != null) return b; return binding; } public Object getValue(ThreadLocalData tld) { Cons binding = getBinding(tld); if(binding != null) return binding.first; throw new InvalidOperationException(this.toString() + " is unbound."); } public Object setValue(ThreadLocalData tld, Object val) { Cons b = getDynamicBinding(tld); if(b != null) return b.first = val; //allow global set to create binding like this? if(binding == null)
- throw new InvalidOperationException(this.toString() + " is unbound."); if(val is IFn) this.fn = (IFn) val; else this.fn = null; //todo, bind to throw stub? return binding.first = val; } public Cons getDynamicBinding(ThreadLocalData tld) { return (Cons) tld.dynamicBindings[this]; } public Cons pushDynamicBinding(ThreadLocalData tld, Object val) { Cons ret = new Cons(val, getDynamicBinding(tld)); tld.dynamicBindings[this] = ret; return ret; } public Cons popDynamicBinding(ThreadLocalData tld) { Cons oldb = getDynamicBinding(tld).rest; tld.dynamicBindings[this] = oldb;
- return oldb; } override public Object invoke(ThreadLocalData tld) /*throws Exception*/ { return fn.invoke(tld); } override public Object invoke(ThreadLocalData tld, Object arg1) /*throws Exception*/ { return fn.invoke(tld,arg1); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2,arg3); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2,arg3,arg4); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2,arg3,arg4,arg5); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2,arg3,arg4,arg5,args); } }
+ this.fn = null; //todo, bind to throw stub? return this; } public Box getBinding(ThreadLocalData tld) { Box b = getDynamicBinding(tld); if(b != null) return b; return binding; } public Object getValue(ThreadLocalData tld) { Box binding = getBinding(tld); if(binding != null) return binding.val; throw new InvalidOperationException(this.toString() + " is unbound."); } public Object setValue(ThreadLocalData tld, Object val) { Box b = getDynamicBinding(tld); if(b != null) return b.val = val; //allow global set to create binding like this? if(binding == null)
+ throw new InvalidOperationException(this.toString() + " is unbound."); if(val is IFn) this.fn = (IFn) val; else this.fn = null; //todo, bind to throw stub? return binding.val = val; } public Box getDynamicBinding(ThreadLocalData tld) { return (Box) tld.dynamicBindings[this]; } public Box establishDynamicBinding(ThreadLocalData tld, Object val) { Box ret = getDynamicBinding(tld); tld.dynamicBindings[this] = new Box(val); return ret; } public void restoreDynamicBinding(ThreadLocalData tld, Box old) { tld.dynamicBindings[this] = old;
+ } override public Object invoke(ThreadLocalData tld) /*throws Exception*/ { return fn.invoke(tld); } override public Object invoke(ThreadLocalData tld, Object arg1) /*throws Exception*/ { return fn.invoke(tld,arg1); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2,arg3); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2,arg3,arg4); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2,arg3,arg4,arg5); } override public Object invoke(ThreadLocalData tld, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Cons args) /*throws Exception*/ { return fn.invoke(tld,arg1,arg2,arg3,arg4,arg5,args); } }
}
diff --git a/src/org/clojure/runtime/Cons.java b/src/org/clojure/runtime/Cons.java
index 0d8de670..23278b6b 100644
--- a/src/org/clojure/runtime/Cons.java
+++ b/src/org/clojure/runtime/Cons.java
@@ -14,8 +14,8 @@ package org.clojure.runtime;
public class Cons extends AMap implements Iter{
-public Object first;
-public Cons rest;
+public final Object first;
+public final Cons rest;
public Cons(Object first, Cons rest)
{
diff --git a/src/org/clojure/runtime/Var.java b/src/org/clojure/runtime/Var.java
index fce5344f..9e6fe46f 100644
--- a/src/org/clojure/runtime/Var.java
+++ b/src/org/clojure/runtime/Var.java
@@ -16,7 +16,7 @@ public class Var extends AFn{
public final Symbol sym;
public Namespace namespace;
-public Cons binding;
+public Box binding;
public IFn fn; //todo, bind to throw stub?
public IFn setfn;
@@ -38,9 +38,9 @@ public String toString()
public Var bind(Object val)
{
if(binding == null)
- binding = new Cons(val,null);
+ binding = new Box(val);
else
- binding.first = val;
+ binding.val = val;
if(val instanceof IFn)
this.fn = (IFn) val;
@@ -50,9 +50,9 @@ public Var bind(Object val)
return this;
}
-public Cons getBinding(ThreadLocalData tld)
+public Box getBinding(ThreadLocalData tld)
{
- Cons b = getDynamicBinding(tld);
+ Box b = getDynamicBinding(tld);
if(b != null)
return b;
return binding;
@@ -60,17 +60,17 @@ public Cons getBinding(ThreadLocalData tld)
public Object getValue(ThreadLocalData tld)
{
- Cons binding = getBinding(tld);
+ Box binding = getBinding(tld);
if(binding != null)
- return binding.first;
+ return binding.val;
throw new IllegalStateException(this.toString() + " is unbound.");
}
public Object setValue(ThreadLocalData tld, Object val)
{
- Cons b = getDynamicBinding(tld);
+ Box b = getDynamicBinding(tld);
if(b != null)
- return b.first = val;
+ return b.val = val;
//allow global set to create binding like this?
if(binding == null)
throw new IllegalStateException(this.toString() + " is unbound.");
@@ -80,24 +80,24 @@ public Object setValue(ThreadLocalData tld, Object val)
else
this.fn = null; //todo, bind to throw stub?
- return binding.first = val;
+ return binding.val = val;
}
-final public Cons getDynamicBinding(ThreadLocalData tld)
+final public Box getDynamicBinding(ThreadLocalData tld)
{
- return (Cons) tld.dynamicBindings.get(this);
+ return (Box) tld.dynamicBindings.get(this);
}
-final public Cons pushDynamicBinding(ThreadLocalData tld, Object val)
+final public Box establishDynamicBinding(ThreadLocalData tld, Object val)
{
- Cons ret = new Cons(val, getDynamicBinding(tld));
- tld.dynamicBindings.put(this, ret);
+ Box ret = getDynamicBinding(tld);
+ tld.dynamicBindings.put(this, new Box(val));
return ret;
}
-final public Cons popDynamicBinding(ThreadLocalData tld)
+final public void restoreDynamicBinding(ThreadLocalData tld, Box old)
{
- return (Cons) tld.dynamicBindings.put(this, getDynamicBinding(tld).rest);
+ tld.dynamicBindings.put(this, old);
}
public Object invoke(ThreadLocalData tld) throws Exception