commit 1fd98e0abcb9c888d5a013561cce5e99aecffa8b
parent 3ccab2c059bebf5c26480765298385d3251adf17
Author: tomas <tomas@logand.com>
Date: Sat, 10 Oct 2009 23:56:49 +0200
java run repl fix, unframe unbinds, up impl, xrun + eval accept cnt+lst TODO
Diffstat:
M | wl.java | | | 86 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------- |
1 file changed, 62 insertions(+), 24 deletions(-)
diff --git a/wl.java b/wl.java
@@ -281,8 +281,9 @@ class wl implements Runnable {
Any Z = null;
System.out.print(": ");
while(null != (Z = read1(true))) {
+ Any X = eval(Z);
System.out.print("-> ");
- print(eval(Z));
+ print(X);
System.out.println();
System.out.print(": ");
}
@@ -296,22 +297,26 @@ class wl implements Runnable {
return Sd.get(Nm);
}
- Any xrun(Any E) {
+ Any xrun(Any P, int n, Any L) {
Any Z = NIL;
- while(NIL != E) {
- Z = eval(E.car());
- E = E.cdr();
- }
+ if(P.isCons())
+ while(NIL != P) {
+ Z = eval(P.car());
+ P = P.cdr();
+ }
+ else eval(P);
return Z;
}
- Any eval(Any E) {
+ Any xrun(Any P) {return xrun(P, 0, NIL);}
+ Any eval(Any X, int n, Any L) {
Any Z = NIL;
- if(E.isCons()) Z = apply(E);
- else if(E.isIsym()) Z = E.val();
- else if(E.isObj()) Z = E;
- else err(E, "Don't know how to eval");
+ if(X.isCons()) Z = apply(X);
+ else if(X.isIsym()) Z = X.val();
+ else if(X.isObj()) Z = X;
+ else err(X, "Don't know how to eval");
return Z;
}
+ Any eval(Any X) {return eval(X, 0, NIL);}
Any apply(Any E) {
Any Z = NIL;
Any F = eval(E.car());
@@ -328,26 +333,23 @@ class wl implements Runnable {
Any Fa = F.car();
Any Fb = F.cdr();
frame();
- int n = 0;
if(Fa.isIsym()) { // (@ . P) | (L . P) | (NIL . P)
if(NIL != Fa) {
- if(At == Fa) {bind(Args, mkCons(NIL, mapcarEval(A))); n++;}
- else {bind(Fa, A); n++;}
+ if(At == Fa) bind(Args, mkCons(NIL, mapcarEval(A)));
+ else bind(Fa, A);
}
} else if(Fa.isCons()) { // ((L ...) . P)
while(Fa.isCons()) {
bind(Fa.car(), eval(A.car()));
- n++;
Fa = Fa.cdr();
A = A.cdr();
}
if(NIL != Fa) {
- if(At == Fa) {bind(Args, mkCons(NIL, mapcarEval(A))); n++;}
- else {bind(Fa, A); n++;}
+ if(At == Fa) bind(Args, mkCons(NIL, mapcarEval(A)));
+ else bind(Fa, A);
}
} else err(Fa, "Don't know how to bind");
Z = xrun(Fb);
- unbind(n);
unframe();
return Z;
}
@@ -402,7 +404,7 @@ class wl implements Runnable {
Env.val(E.cdr());
}
void unbind(int n) {for(int i = 0; i < n; i++) unbind();}
- void unframe() {Env.val(Env.val().cdr());}
+ void unframe() {while(T != Env.val().car()) unbind(); Env.val(Env.val().cdr());}
void fn(String Nm, Fn F) {
Any Z = Sd.get(Nm);
@@ -423,10 +425,28 @@ class wl implements Runnable {
Sd.put("java.lang.Class", mkIsym("java.lang.Class", mkObj(Class.class)));
fn("run", new Fn() {public Any fn(Any E) {
- return xrun(eval(E.cdr().car()));
+ Any I = E.cdr();
+ Any P = eval(I.car());
+ int n = 0;
+ Any L = NIL;
+ if(I.cdr().isCons()) {
+ I = I.cdr();
+ n = ((BigInteger) I.car().val()).intValue();
+ if(I.cdr().isCons()) L = I.cdr();
+ }
+ return xrun(P, n, L);
}});
fn("eval", new Fn() {public Any fn(Any E) {
- return eval(eval(E.cdr().car()));
+ Any I = E.cdr();
+ Any X = eval(I.car());
+ int n = 0;
+ Any L = NIL;
+ if(I.cdr().isCons()) {
+ I = I.cdr();
+ n = ((BigInteger) I.car().val()).intValue();
+ if(I.cdr().isCons()) L = I.cdr();
+ }
+ return eval(X, n, L);
}});
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();}});
@@ -709,9 +729,27 @@ class wl implements Runnable {
} else err(E, "Don't know how to let");
return Z;
}});
- fn("up", new Fn() {public Any fn(Any E) {
- // TODO
- return NIL;
+ fn("up", new Fn() {public Any fn(Any E) { // TODO cnt frame up
+ Any Z;
+ Any I = E.cdr();
+ Any K = I.car();
+ I = I.cdr();
+ if(I.isCons()) { // (up K 'Z)
+ Z = eval(I.car());
+ boolean done = false;
+ for(Any J = Env.val(); J.isCons() && T != J.car(); J = J.cdr()) {
+ Any C = J.car();
+ if(K == C.car()) {C.cdr(Z); done = true; break;}
+ }
+ if(!done) Env.val(mkCons(mkCons(K, Z), Env.val()));
+ } else { // (up K)
+ Z = K.val();
+ for(Any J = Env.val(); J.isCons() && T != J.car(); J = J.cdr()) {
+ Any C = J.car();
+ if(K == C.car()) {Z = C.cdr(); break;}
+ }
+ }
+ return Z;
}});
fn("jnew", new Fn() {public Any fn(Any E) { // jnew 'cls [arg ...]