commit 0927fd391a7bb06fa67a2aeb977ddd0cf0175ad6
parent 8c579a5c63b1a9116835b31288f499cde9204115
Author: tomas <tomas@logand.com>
Date: Wed, 7 Oct 2009 23:19:53 +0200
Sym uses val and prop instead of car and cdr
Diffstat:
M | wl.java | | | 133 | +++++++++++++++++++++++++++++++++++++++++++------------------------------------ |
1 file changed, 72 insertions(+), 61 deletions(-)
diff --git a/wl.java b/wl.java
@@ -61,9 +61,13 @@ class wl implements Runnable {
public String nm();
public Any car();
public Any cdr();
+ public Any val();
+ public Any prop();
public Object cxr();
public Any car(Any a);
public Any cdr(Any d);
+ public Any val(Any v);
+ public Any prop(Any p);
public Object cxr(Object x);
public boolean isCons();
public boolean isSym();
@@ -80,10 +84,14 @@ class wl implements Runnable {
public String nm() {err("No Cons.nm"); return null;}
public Any car() {return car;}
public Any cdr() {return cdr;}
+ public Any val() {err("No Cons.val"); return null;}
+ public Any prop() {err("No Cons.prop"); return null;}
public Object cxr() {err("No Cons.cxr"); return null;}
public Any car(Any a) {car = a; return car;}
public Any cdr(Any d) {cdr = d; return cdr;}
- public Object cxr(Object x) {err("No Cons.obj"); return null;}
+ public Any val(Any v) {err("No Cons.val"); return null;}
+ public Any prop(Any p) {err("No Cons.prop"); return null;}
+ public Object cxr(Object x) {err("No Cons.cxr"); return null;}
public boolean isCons() {return true;};
public boolean isSym() {return false;};
public boolean isIsym() {return false;};
@@ -96,15 +104,19 @@ class wl implements Runnable {
static interface Sym extends Any {}
static class Isym implements Sym {
public String nm;
- public Any car, cdr;
- public Isym(String n, Any a, Any d) {nm = n; car = a; cdr = d;}
+ public Any val, prop;
+ public Isym(String n, Any v, Any p) {nm = n; val = v; prop = p;}
public String nm() {return nm;}
- public Any car() {return car;}
- public Any cdr() {return cdr;}
+ public Any car() {if(NIL != this) err("No Isym.car"); return NIL;}
+ public Any cdr() {if(NIL != this) err("No Isym.cdr"); return NIL;}
+ public Any val() {return val;}
+ public Any prop() {return prop;}
public Object cxr() {err("No Isym.cxr"); return null;}
- public Any car(Any a) {car = a; return car;}
- public Any cdr(Any d) {cdr = d; return cdr;}
- public Object cxr(Object x) {err("No Isym.obj"); return null;}
+ public Any car(Any a) {err("No Isym.car"); return null;}
+ public Any cdr(Any d) {err("No Isym.cdr"); return null;}
+ public Any val(Any v) {val = v; return val;}
+ public Any prop(Any p) {prop = p; return prop;}
+ public Object cxr(Object x) {err("No Isym.cxr"); return null;}
public boolean isCons() {return false;};
public boolean isSym() {return true;};
public boolean isIsym() {return true;};
@@ -120,9 +132,13 @@ class wl implements Runnable {
public String nm() {err("No Obj.nm"); return null;}
public Any car() {err("No Obj.car"); return null;}
public Any cdr() {err("No Obj.cdr"); return null;}
+ public Any val() {err("No Obj.val"); return null;}
+ public Any prop() {err("No Obj.prop"); return null;}
public Object cxr() {return cxr;}
public Any car(Any a) {err("No Obj.set"); return null;}
public Any cdr(Any d) {err("No Obj.con"); return null;}
+ public Any val(Any v) {err("No Obj.val"); return null;}
+ public Any prop(Any p) {err("No Obj.prop"); return null;}
public Object cxr(Object x) {cxr = x; return cxr;}
public boolean isCons() {return false;};
public boolean isSym() {return false;};
@@ -135,28 +151,27 @@ class wl implements Runnable {
}
static Any mkCons(Any a, Any d) {return new Cons(a, d);}
- static Any mkIsym(String n, Any a, Any d) {return new Isym(n, a, d);}
+ static Any mkIsym(String n, Any v) {return new Isym(n, v, NIL);}
static Any mkObj(Object x) {return new Obj(x);}
static Any mkOint(String x) {return mkObj(new BigInteger(x));}
static Any mkOfix(String x) {err("mkOfix not implemented"); return null;}
- final static Any NIL = mkIsym("NIL", null, null);
- final static Any T = mkIsym("T", NIL, null);
+ final static Any NIL = mkIsym("NIL", null);
+ final static Any T = mkIsym("T", null);
static {
- NIL.car(NIL);
- NIL.cdr(NIL);
- T.cdr(T);
+ NIL.val(NIL);
+ T.val(T);
}
// reader
final static Any Lp = mkObj(null);
final static Any Rp = mkObj(null);
- final Any Qte = mkIsym("quote", NIL, NIL);
- final Any Dot = mkIsym(".", NIL, NIL);
- final Any At = mkIsym("@", NIL, NIL);
- final Any Args = mkIsym("*Args", NIL, NIL);
+ final Any Qte = mkIsym("quote", NIL);
+ final Any Dot = mkIsym(".", NIL);
+ final Any At = mkIsym("@", NIL);
+ final Any Args = mkIsym("*Args", NIL);
class In {
Character c;
@@ -164,11 +179,11 @@ class wl implements Runnable {
public In(InputStream S) {c = null; s = S;}
}
- final Any In = mkIsym("*In", NIL, mkObj(new In(System.in)));
- final Any Out = mkIsym("*Out", NIL, mkObj(System.out));
+ final Any In = mkIsym("*In", mkObj(new In(System.in)));
+ final Any Out = mkIsym("*Out", mkObj(System.out));
Character peek() {
- In I = (In) In.cdr().cxr();
+ In I = (In) In.val().cxr();
try {
if(null == I.c) I.c = (char) I.s.read();
} catch(Exception e) {} // TODO eof vs error?
@@ -176,7 +191,7 @@ class wl implements Runnable {
}
Character xchar() {
peek();
- In I = (In) In.cdr().cxr();
+ In I = (In) In.val().cxr();
Character Z = I.c;
I.c = null;
return Z;
@@ -262,7 +277,7 @@ class wl implements Runnable {
HashMap<String, Any> Sd = new HashMap<String, Any>();
Any intern(String Nm) {
- if(!Sd.containsKey(Nm)) Sd.put(Nm, mkIsym(Nm, NIL, NIL));
+ if(!Sd.containsKey(Nm)) Sd.put(Nm, mkIsym(Nm, NIL));
return Sd.get(Nm);
}
@@ -277,7 +292,7 @@ class wl implements Runnable {
Any eval(Any E) {
Any Z = NIL;
if(E.isCons()) Z = apply(E);
- else if(E.isIsym()) Z = E.cdr();
+ else if(E.isIsym()) Z = E.val();
else if(E.isObj()) Z = E;
else err(E, "Don't know how to eval");
return Z;
@@ -286,9 +301,9 @@ class wl implements Runnable {
Any Z = NIL;
Any F = eval(E.car());
if(F.isCons()) Z = applyC(E, F);
- else if(F.isSym()) Z = applyC(E, F);
+ //else if(F.isSym()) Z = applyS(E, F); // TODO ?
else if(F.isOfn()) Z = ((Fn) F.cxr()).fn(E);
- else if(F.isObj()) Z = japplyC(E, F);
+ else if(F.isObj()) Z = applyO(E, F);
else err(E, "Don't know how to apply");
return Z;
}
@@ -320,8 +335,8 @@ class wl implements Runnable {
O = mkCons(Args.cdr(), NIL);
Args.cdr(mkCons(NIL, mapcarEval(A)));
} else {
- O = mkCons(Fa.cdr(), NIL);
- Fa.cdr(A);
+ O = mkCons(Fa.car(), NIL);
+ Fa.car(A);
}
}
} else if(Fa.isCons()) {
@@ -330,20 +345,18 @@ class wl implements Runnable {
while(Fa.isCons()) {
Any X = Fa.car();
Fa = Fa.cdr();
- if(!X.isIsym()) err(X, "Isym expected in saveV");
- Z.cdr(mkCons(X.cdr(), NIL));
+ Z.cdr(mkCons(X.val(), NIL));
Z = Z.cdr();
- X.cdr(eval(A.car()));
+ X.val(eval(A.car()));
A = A.cdr();
}
if(NIL != Fa) {
- if(!Fa.isIsym()) err(Fa, "Isym expected in saveV");
if(At == Fa) {
- Z.cdr(mkCons(Args.cdr(), NIL));
- Args.cdr(mkCons(NIL, mapcarEval(A)));
+ Z.cdr(mkCons(Args.val(), NIL));
+ Args.val(mkCons(NIL, mapcarEval(A)));
} else {
- Z.cdr(mkCons(Fa.cdr(), NIL));
- Fa.cdr(A);
+ Z.cdr(mkCons(Fa.val(), NIL));
+ Fa.val(A);
}
}
O = B.cdr();
@@ -353,25 +366,23 @@ class wl implements Runnable {
void restoreV(Any Fa, Any O) {
if(Fa.isIsym()) {
if(NIL != Fa) {
- if(At == Fa) Args.cdr(O.car());
- else Fa.cdr(O.car());
+ if(At == Fa) Args.car(O.car());
+ else Fa.car(O.car());
}
} else if(Fa.isCons()) {
while(Fa.isCons()) {
Any X = Fa.car();
Fa = Fa.cdr();
- if(!X.isIsym()) err(X, "Isym expected in restoreV");
- X.cdr(O.car());
+ X.val(O.car());
O = O.cdr();
}
if(NIL != Fa) {
- if(!Fa.isIsym()) err(Fa, "Isym expected in saveV");
- if(At == Fa) Args.cdr(O.car());
- else Fa.cdr(O.car());
+ if(At == Fa) Args.val(O.car());
+ else Fa.val(O.car());
}
} else err(Fa, "Don't know how to restoreV");
}
- Any japplyC(Any E, Any O) { // 'obj 'meth [arg ...]
+ Any applyO(Any E, Any O) { // 'obj 'meth [arg ...]
Any I = E.cdr();
Any F = eval(I.car());
Any A = I.cdr();
@@ -379,17 +390,18 @@ class wl implements Runnable {
ArrayList<Object> a = new ArrayList();
ArrayList<Class> t = new ArrayList();
for(Any X = A; NIL != X; X = X.cdr()) {
- // TODO handle non-native?
Any Y = eval(X.car());
- a.add(Y.cxr());
- t.add(Y.cxr().getClass());
+ Object y = Y.isIsym() ? Y.nm() : Y.cxr();
+ a.add(y);
+ t.add(y.getClass());
}
Object[] aa = a.toArray();
Class[] ta = (Class[]) t.toArray(new Class[aa.length]);
try {
Object o = O.cxr();
Class c = o instanceof Class ? (Class) o : o.getClass();
- Method m = c.getMethod(F.nm(), ta);
+ String nm = F.isOstr() ? (String) F.cxr() : F.nm();
+ Method m = c.getMethod(nm, ta);
Object r = m.invoke(o, aa);
Z = mkObj(r);
} catch(NoSuchMethodException e) {
@@ -404,8 +416,8 @@ class wl implements Runnable {
void fn(String Nm, Fn F) {
Any Z = Sd.get(Nm);
- if(null != Z) Z.cdr(mkObj(F));
- else Sd.put(Nm, mkIsym(Nm, NIL, mkObj(F)));
+ if(null != Z) Z.val(mkObj(F));
+ else Sd.put(Nm, mkIsym(Nm, mkObj(F)));
}
public wl() {
@@ -417,7 +429,7 @@ class wl implements Runnable {
Sd.put("*Args", Args);
Sd.put("*In", In);
Sd.put("*Out", Out);
- Sd.put("java.lang.Class", mkObj(java.lang.Class.class));
+ Sd.put("java.lang.Class", mkIsym("java.lang.Class", mkObj(Class.class)));
fn("run", new Fn() {public Any fn(Any E) {return xrun(E.cdr().car());}});
fn("eval", new Fn() {public Any fn(Any E) {return eval(eval(E.cdr().car()));}});
@@ -576,17 +588,16 @@ class wl implements Runnable {
fn("def", new Fn() {public Any fn(Any E) {
Any X = E.cdr();
Any N = eval(X.car());
- if(!N.isSym()) err(E, "Symbol expected");
if(!Sd.containsKey(N.nm())) err(E, "Symbol not interned");
Any V = eval(X.cdr().car());
- Sd.get(N.nm()).cdr(V);
+ Sd.get(N.nm()).val(V);
return N;
}});
fn("val", new Fn() {public Any fn(Any E) {
Any Z = NIL;
Any X = eval(E.cdr().car());
if(X.isCons()) Z = X.car();
- else if(X.isSym()) Z = X.cdr();
+ else if(X.isSym()) Z = X.val();
else if(X.isObj()) Z = X;
else err(E, "Don't know how to val");
return Z;
@@ -607,10 +618,10 @@ class wl implements Runnable {
ArrayList<Object> a = new ArrayList();
ArrayList<Class> t = new ArrayList();
for(Any X = A; NIL != X; X = X.cdr()) {
- // TODO handle non-native?
Any Y = eval(X.car());
- a.add(Y.cxr());
- t.add(Y.cxr().getClass());
+ Object y = Y.isIsym() ? Y.nm() : Y.cxr();
+ a.add(y);
+ t.add(y.getClass());
}
Object[] aa = a.toArray();
Class[] ta = (Class[]) t.toArray(new Class[aa.length]);
@@ -661,7 +672,7 @@ class wl implements Runnable {
}
void print(Any E) {
- PrintStream S = (PrintStream) Out.cdr().cxr();
+ PrintStream S = (PrintStream) Out.val().cxr();
if(E.isCons()) {
Any X = E;
if(Qte == X.car()) {
@@ -706,10 +717,10 @@ class wl implements Runnable {
String str(Any E) {
ByteArrayOutputStream B = new ByteArrayOutputStream();
PrintStream S = new PrintStream(B);
- Any O = Out.cdr();
- Out.cdr(mkObj(S));
+ Any O = Out.val();
+ Out.val(mkObj(S));
print(E);
- Out.cdr(O);
+ Out.val(O);
String Z = null;
try {
Z = B.toString(Enc);