commit ece72e5ae3a5298045be26bff225d3d6ae28b10a
parent f52a20b38a71df5f713542e6a8ad47ac6dab7bd8
Author: tomas <tomas@logand.com>
Date: Sun, 11 Oct 2009 11:54:59 +0200
cxr renamed to obj, number reader, clean up
Diffstat:
M | wl.java | | | 217 | +++++++++++++++++++------------------------------------------------------------ |
1 file changed, 52 insertions(+), 165 deletions(-)
diff --git a/wl.java b/wl.java
@@ -65,12 +65,12 @@ class wl implements Runnable {
public Any cdr();
public Any val();
public Any prop();
- public Object cxr();
+ public Object obj();
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 Object obj(Object x);
public boolean isCons();
public boolean isSym();
public boolean isIsym();
@@ -88,12 +88,12 @@ class wl implements Runnable {
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 Object obj() {err("No Cons.obj"); return null;}
public Any car(Any a) {car = a; return car;}
public Any cdr(Any d) {cdr = d; return cdr;}
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 Object obj(Object x) {err("No Cons.obj"); return null;}
public boolean isCons() {return true;};
public boolean isSym() {return false;};
public boolean isIsym() {return false;};
@@ -113,12 +113,12 @@ class wl implements Runnable {
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 Object obj() {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 Object obj(Object x) {err("No Isym.obj"); return null;}
public boolean isCons() {return false;};
public boolean isSym() {return true;};
public boolean isIsym() {return true;};
@@ -129,26 +129,26 @@ class wl implements Runnable {
public boolean isOobj() {return false;};
}
static class Obj implements Any {
- public Object cxr;
- public Obj(Object x) {cxr = x;}
+ public Object obj;
+ public Obj(Object x) {obj = x;}
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 Object obj() {return obj;}
public Any car(Any a) {err("No Obj.car"); return null;}
public Any cdr(Any d) {err("No Obj.cdr"); 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 Object obj(Object x) {obj = x; return obj;}
public boolean isCons() {return false;};
public boolean isSym() {return false;};
public boolean isIsym() {return false;};
public boolean isObj() {return true;};
- public boolean isOfn() {return cxr instanceof Fn;};
- public boolean isOstr() {return cxr instanceof String;};
- public boolean isOnum() {return cxr instanceof BigInteger;};
+ public boolean isOfn() {return obj instanceof Fn;};
+ public boolean isOstr() {return obj instanceof String;};
+ public boolean isOnum() {return obj instanceof BigInteger;};
public boolean isOobj() {return !isOfn() && !isOstr() && !isOnum();};
}
@@ -206,10 +206,10 @@ class wl implements Runnable {
final Any Env = mkIsym("*Env", NIL);
final Any Stk = mkIsym("*Stk", NIL);
- Character peek() {return ((In) In.val().cxr()).peek();}
- Character xchar() {return ((In) In.val().cxr()).xchar();}
- boolean eof() {return ((In) In.val().cxr()).eof();}
- void eof(Any X) {((In) In.val().cxr()).eof(X);}
+ Character peek() {return ((In) In.val().obj()).peek();}
+ Character xchar() {return ((In) In.val().obj()).xchar();}
+ boolean eof() {return ((In) In.val().obj()).eof();}
+ void eof(Any X) {((In) In.val().obj()).eof(X);}
boolean charIn(Character C, String L) {return 0 <= L.indexOf(C);}
void skip1() {
@@ -227,12 +227,21 @@ class wl implements Runnable {
Any symbol() {
Character C = xchar();
if(charIn(C, "#()\" \t\n\r")) err(C, "Symbol expected");
- StringBuffer L = new StringBuffer();
- L.append(C);
- while((null != (C = peek())) && !charIn(C, "#()\" \t\n\r"))
- L.append(xchar());
- String M = L.toString();
- return intern(M);
+ boolean N = charIn(C, "+-0123456789.");
+ boolean F = '.' == C;
+ StringBuffer b = new StringBuffer();
+ b.append(C);
+ while((null != (C = peek())) && !charIn(C, "#()\" \t\n\r")) {
+ C = xchar();
+ b.append(C);
+ if(N && !charIn(C, "0123456789")) {
+ if(!F && '.' == C) F = true;
+ else N = false;
+ }
+ }
+ String M = b.toString();
+ if(1 == M.length() && charIn(M.charAt(0), "+-.")) N = false;
+ return N ? (F ? mkOfix(M) : mkOint(M)) : intern(M);
}
Any text() {
StringBuffer L = new StringBuffer();
@@ -259,7 +268,6 @@ class wl implements Runnable {
Character X = peek();
if(null != X) {
switch(X) {
- // case "#": return comment();
case '(': xchar(); Z = readL(); break;
case ')': xchar(); if(Top) err("Reader overflow"); Z = Rp; break;
case '"': xchar(); Z = text(); break;
@@ -336,7 +344,7 @@ class wl implements Runnable {
Stk.val(mkCons(E.car(), Stk.val()));
if(F.isCons()) 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.isOfn()) Z = ((Fn) F.obj()).fn(E);
else if(F.isObj()) Z = applyO(E, F);
else err(E, "Don't know how to apply");
Stk.val(Stk.val().cdr());
@@ -387,16 +395,16 @@ class wl implements Runnable {
ArrayList<Class> t = new ArrayList();
for(Any X = A; NIL != X; X = X.cdr()) {
Any Y = eval(X.car());
- Object y = Y.isIsym() ? Y.nm() : Y.cxr();
+ Object y = Y.isIsym() ? Y.nm() : Y.obj();
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();
+ Object o = O.obj();
Class c = o instanceof Class ? (Class) o : o.getClass();
- String nm = F.isOstr() ? (String) F.cxr() : F.nm();
+ String nm = F.isOstr() ? (String) F.obj() : F.nm();
Method m = c.getMethod(nm, ta);
Object r = m.invoke(o, aa);
Z = mkObj(r);
@@ -427,6 +435,7 @@ class wl implements Runnable {
else Sd.put(Nm, mkIsym(Nm, mkObj(F)));
}
Any undo(int n, Any L) {
+ if(n != 1) err("TODO undo n!=1");
Any Z = NIL;
Any E = Env.val();
while(E.isCons() && T != E.car()) {
@@ -492,7 +501,7 @@ class wl implements Runnable {
Any L = NIL;
if(I.cdr().isCons()) {
I = I.cdr();
- n = 1; // TODO ((BigInteger) I.car().val()).intValue();
+ n = ((BigInteger) I.car().obj()).intValue();
if(I.cdr().isCons()) L = I.cdr();
}
return xrun(P, n, L);
@@ -504,7 +513,7 @@ class wl implements Runnable {
Any L = NIL;
if(I.cdr().isCons()) {
I = I.cdr();
- n = 1; // TODO ((BigInteger) I.car().val()).intValue();
+ n = ((BigInteger) I.car().obj()).intValue();
if(I.cdr().isCons()) L = I.cdr();
}
return eval(X, n, L);
@@ -512,56 +521,6 @@ class wl implements Runnable {
fn("quote", new Fn() {public Any fn(Any E) {return E.cdr();}});
fn("car", new Fn() {public Any fn(Any E) {return eval(E.cdr().car()).car();}});
fn("cdr", new Fn() {public Any fn(Any E) {return eval(E.cdr().car()).cdr();}});
- // fn("-", new Fn() {public Any fn(Any E) {
- // Any X = E.cdr;
- // Any Z = eval(X.car);
- // if(NIL == Z) return NIL;
- // if(NIL == X.cdr) Z.cxr = -((Integer) Z.cxr);
- // else
- // while(NIL != X.cdr) {
- // X = X.cdr;
- // Any Y = eval(X.car);
- // if(NIL == Y) return NIL;
- // Z.cxr = (Integer) Z.cxr - (Integer) Y.cxr;
- // }
- // return Z;
- // }});
- // fn("*", new Fn() {public Any fn(Any E) {
- // Any X = E.cdr;
- // Any Z = eval(X.car);
- // if(NIL == Z) return NIL;
- // while(NIL != X.cdr) {
- // X = X.cdr;
- // Any Y = eval(X.car);
- // if(NIL == Y) return NIL;
- // Z.cxr = (Integer) Z.cxr * (Integer) Y.cxr;
- // }
- // return Z;
- // }});
- // fn("/", new Fn() {public Any fn(Any E) {
- // Any X = E.cdr;
- // Any Z = eval(X.car);
- // if(NIL == Z) return NIL;
- // while(NIL != X.cdr) {
- // X = X.cdr;
- // Any Y = eval(X.car);
- // if(NIL == Y) return NIL;
- // Z.cxr = (Integer) Z.cxr / (Integer) Y.cxr;
- // }
- // return Z;
- // }});
- // fn("%", new Fn() {public Any fn(Any E) {
- // Any X = E.cdr;
- // Any Z = eval(X.car);
- // if(NIL == Z) return NIL;
- // while(NIL != X.cdr) {
- // X = X.cdr;
- // Any Y = eval(X.car);
- // if(NIL == Y) return NIL;
- // Z.cxr = (Integer) Z.cxr % (Integer) Y.cxr;
- // }
- // return Z;
- // }});
fn("loop", new Fn() {public Any fn(Any E) {
while(true) {
for(Any X = E.cdr(); X.isCons(); X = X.cdr()) {
@@ -587,7 +546,6 @@ class wl implements Runnable {
Any X = E.cdr();
return eval(X.car()) == eval(X.cdr().car()) ? T : NIL;
}});
-
fn("peek", new Fn() {public Any fn(Any E) {
Character X = peek();
return null == X ? NIL : mkObj(X.toString());
@@ -597,7 +555,7 @@ class wl implements Runnable {
return null == X ? NIL : mkObj(X.toString());
}});
fn("print", new Fn() {public Any fn(Any E) {
- PrintStream S = (PrintStream) Out.val().cxr();
+ PrintStream S = (PrintStream) Out.val().obj();
Any Z = NIL;
int I = 0;
for(Any X = E.cdr(); NIL != X; X = X.cdr()) {
@@ -608,7 +566,7 @@ class wl implements Runnable {
return Z;
}});
fn("prin", new Fn() {public Any fn(Any E) {
- PrintStream S = (PrintStream) Out.val().cxr();
+ PrintStream S = (PrintStream) Out.val().obj();
Any Z = NIL;
int I = 0;
for(Any X = E.cdr(); NIL != X; X = X.cdr()) {
@@ -635,66 +593,6 @@ class wl implements Runnable {
}
return mkObj(Z);
}});
-
- // fn("in", new Fn() {public Any fn(Any E) {
- // Any X = E.cdr;
- // String F = evStr(X.car);
- // In S = null;
- // Any Z = NIL;
- // try {
- // S = new In(new FileInputStream(F));
- // In I = (In) In.cxr;
- // In.cxr = S;
- // Z = xrun(X.cdr);
- // In.cxr = I;
- // S.s.close();
- // } catch(FileNotFoundException e) {
- // err(E, "File not found");
- // } catch(IOException e) {
- // err(E, "Error closing input");
- // }
- // return Z;
- // }});
- // fn("out", new Fn() {public Any fn(Any E) {
- // Any X = E.cdr;
- // String F = evStr(X.car);
- // Any Z = NIL;
- // try {
- // FileOutputStream B = new FileOutputStream(F);
- // PrintStream S = new PrintStream(B);
- // OutputStream O = (OutputStream) Out.cxr;
- // Out.cxr = S;
- // Z = xrun(X.cdr);
- // Out.cxr = O;
- // S.close();
- // } catch(FileNotFoundException e) {
- // err(E, "File not found");
- // }
- // return Z;
- // }});
- // fn("load", new Fn() {public Any fn(Any E) {
- // Any Z = NIL;
- // for(Any X = E.cdr; NIL != X; X = X.cdr) {
- // String F = evStr(X.car);
- // In S = null;
- // try {
- // S = new In(new FileInputStream(F));
- // In I = (In) In.cxr;
- // In.cxr = S;
- // do Z = eval(read());
- // while(null != peek());
- // In.cxr = I;
- // S.s.close();
- // return Z;
- // } catch(FileNotFoundException e) {
- // err(E, "File not found");
- // } catch(IOException e) {
- // err(E, "Error closing input");
- // }
- // }
- // return Z;
- // }});
-
fn("def", new Fn() {public Any fn(Any E) {
Any X = E.cdr();
Any A = eval(X.car());
@@ -717,7 +615,7 @@ class wl implements Runnable {
return mkCons(eval(X.car()), eval(X.cdr().car()));
}});
fn("intern", new Fn() {public Any fn(Any E) {
- return intern((String) eval(E.cdr().car()).cxr());
+ return intern((String) eval(E.cdr().car()).obj());
}});
fn("pop", new Fn() {public Any fn(Any E) {
Any Z = NIL;
@@ -851,7 +749,6 @@ class wl implements Runnable {
}
return Z;
}});
-
fn("jnew", new Fn() {public Any fn(Any E) { // jnew 'cls [arg ...]
Any I = E.cdr();
Any C = eval(I.car());
@@ -861,14 +758,14 @@ class wl implements Runnable {
ArrayList<Class> t = new ArrayList();
for(Any X = A; NIL != X; X = X.cdr()) {
Any Y = eval(X.car());
- Object y = Y.isIsym() ? Y.nm() : Y.cxr();
+ Object y = Y.isIsym() ? Y.nm() : Y.obj();
a.add(y);
t.add(y.getClass());
}
Object[] aa = a.toArray();
Class[] ta = (Class[]) t.toArray(new Class[aa.length]);
try {
- Constructor c = ((Class) C.cxr()).getConstructor(ta);
+ Constructor c = ((Class) C.obj()).getConstructor(ta);
Object r = c.newInstance(aa);
Z = mkObj(r);
} catch(NoSuchMethodException e) {
@@ -890,7 +787,7 @@ class wl implements Runnable {
Any F = eval(X.car());
Any Z = NIL;
try {
- Object o = O.cxr();
+ Object o = O.obj();
Class c = o instanceof Class ? (Class) o : o.getClass();
Field f = c.getField(F.nm());
Object r = f.get(o);
@@ -904,17 +801,8 @@ class wl implements Runnable {
}});
}
- String evStr(Any E) {
- Any X = eval(E);
- String S = null;
- if(X.isSym()) S = X.nm();
- else if(X.isOstr()) S = (String) X.cxr();
- else err(E, "Don't know how to evStr");
- return S;
- }
-
void print(Any E) {
- PrintStream S = (PrintStream) Out.val().cxr();
+ PrintStream S = (PrintStream) Out.val().obj();
if(E.isCons()) {
Any X = E;
if(Qte == X.car()) {
@@ -938,10 +826,10 @@ class wl implements Runnable {
S.print(')');
}
} else if(E.isIsym()) S.print(E.nm());
- else if(E.isOnum()) S.print(E.cxr());
+ else if(E.isOnum()) S.print(E.obj());
else if(E.isOstr()) {
S.print('"');
- String X = (String) E.cxr();
+ String X = (String) E.obj();
for(int I = 0; I < X.length(); I++) {
Character C = X.charAt(I);
if('\\' == C) S.print("\\\\");
@@ -951,12 +839,12 @@ class wl implements Runnable {
S.print('"');
} else if(E.isObj()) {
S.print('[');
- S.print(E.cxr());
+ S.print(E.obj());
S.print(']');
} else err(E, "Don't know how to print");
}
Any prin(Any E) {
- PrintStream S = (PrintStream) Out.val().cxr();
+ PrintStream S = (PrintStream) Out.val().obj();
if(NIL == E);
else if(E.isCons()) {
Any X = E;
@@ -966,7 +854,7 @@ class wl implements Runnable {
}
prin(X);
} else if(E.isIsym()) S.print(E.nm());
- else if(E.isObj()) S.print(E.cxr());
+ else if(E.isObj()) S.print(E.obj());
else err(E, "Don't know how to print");
return E;
}
@@ -993,8 +881,7 @@ class wl implements Runnable {
try {
In.val(mkObj(new In(new FileInputStream(F))));
Any Z;
- while(null != (Z = read1(true)))
- eval(Z);
+ while(null != (Z = read1(true))) eval(Z);
} catch(FileNotFoundException e) {
err(F, "File not found");
}