commit ca99dd99deb84fdb5175d5460ba0fdc431534612
parent 1c4cdc19b99423e1415a1e4a2c42b1d3401e0c00
Author: tomas <tomas@logand.com>
Date: Sun, 25 Oct 2009 16:11:57 +0100
up. up fully implemented
Diffstat:
M | wl.java | | | 48 | ++++++++++++++++++++++++++++++++++-------------- |
1 file changed, 34 insertions(+), 14 deletions(-)
diff --git a/wl.java b/wl.java
@@ -947,46 +947,66 @@ 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 cnt frame up
+ fn("up", new Fn() {public Any fn(Any E) { // (up [cnt] sym ['val])
Any Z;
Any I = E.cdr();
Any K = I.car();
I = I.cdr();
- if(I.isCons()) { // (up K 'Z)
+ int n = 1;
+ if(K.isOnum()) {
+ n = ((BigInteger) K.obj()).intValue();
+ K = I.car();
+ I = I.cdr();
+ }
+ if(I.isCons()) { // set
Z = eval(I.car());
boolean done = false;
- for(Any J = Env.val(); J.isCons() && T != J.car(); J = J.cdr()) {
+ for(Any J = Env.val(); J.isCons(); J = J.cdr()) {
Any C = J.car();
- if(K == C.car()) {C.cdr(Z); done = true; break;}
+ if(T == C) {n--; continue;}
+ if(n < 1) break;
+ if(K == C.car()) {if(n <= 1) {C.cdr(Z); done = true; break;}}
}
if(!done) Env.val(mkCons(mkCons(K, Z), Env.val()));
- } else { // (up K)
+ } else { // get
Z = K.val();
- for(Any J = Env.val(); J.isCons() && T != J.car(); J = J.cdr()) {
+ for(Any J = Env.val(); J.isCons(); J = J.cdr()) {
Any C = J.car();
- if(K == C.car()) {Z = C.cdr(); break;}
+ if(T == C) {n--; continue;}
+ if(n < 1) break;
+ if(K == C.car()) {Z = C.cdr(); if(n <= 1) break;}
}
}
return Z;
}});
- fn("up.", new Fn() {public Any fn(Any E) { // TODO cnt frame up
+ fn("up.", new Fn() {public Any fn(Any E) { // (up ['cnt] 'sym ['val])
Any Z;
Any I = E.cdr();
Any K = eval(I.car());
I = I.cdr();
- if(I.isCons()) { // (up 'K 'Z)
+ int n = 1;
+ if(K.isOnum()) {
+ n = ((BigInteger) K.obj()).intValue();
+ K = eval(I.car());
+ I = I.cdr();
+ }
+ if(I.isCons()) { // set
Z = eval(I.car());
boolean done = false;
- for(Any J = Env.val(); J.isCons() && T != J.car(); J = J.cdr()) {
+ for(Any J = Env.val(); J.isCons(); J = J.cdr()) {
Any C = J.car();
- if(K == C.car()) {C.cdr(Z); done = true; break;}
+ if(T == C) {n--; continue;}
+ if(n < 1) break;
+ if(K == C.car()) {if(n <= 1) {C.cdr(Z); done = true; break;}}
}
if(!done) Env.val(mkCons(mkCons(K, Z), Env.val()));
- } else { // (up 'K)
+ } else { // get
Z = K.val();
- for(Any J = Env.val(); J.isCons() && T != J.car(); J = J.cdr()) {
+ for(Any J = Env.val(); J.isCons(); J = J.cdr()) {
Any C = J.car();
- if(K == C.car()) {Z = C.cdr(); break;}
+ if(T == C) {n--; continue;}
+ if(n < 1) break;
+ if(K == C.car()) {Z = C.cdr(); if(n <= 1) break;}
}
}
return Z;