wl

Unnamed repository; edit this file 'description' to name the repository.
git clone https://logand.com/git/wl.git/
Log | Files | Refs | LICENSE

commit b79439d2caac12c98368af6949eb5387234c1351
parent eeb39b653146973b7f7acf27d859c31ca9233ad1
Author: tomas <tomas@logand.com>
Date:   Sat, 24 Oct 2009 23:33:41 +0200

applyC fixed (eval then bind), undo N, fmap o oq fix

Diffstat:
Mjava.wl | 11+++++------
Mwl.java | 72+++++++++++++++++++++++++++++++++++++++++++-----------------------------
2 files changed, 48 insertions(+), 35 deletions(-)

diff --git a/java.wl b/java.wl @@ -161,17 +161,16 @@ (when (pair (cdr N)) (setq N (cdr N)) ) # TODO @ (setq L (cdr L)) ) ) ) -(de foldr (F E L) (ifn (pair L) E (F (car L) (foldr F E (cdr L))))) +(de foldr (F E L) (ifn (pair L) E (F (car L) (foldr F E (cdr L))))) # TODO loop (de foldl1 (F L) (foldl F (pop 'L) L)) (de foldr1 (F L) (foldr F (pop 'L) L)) (de unfoldl (P F G X A) (if (P X) A (unfoldl P F G (G X) (cons2 (F X) A)))) # TODO loop -(de unfoldr (P F G X E) (if (P X) E (cons2 (F X) (unfoldr P F G (G X))))) +(de unfoldr (P F G X E) (if (P X) E (cons2 (F X) (unfoldr P F G (G X))))) # TODO loop (de hylo (P F G E H X) (if (P X) E (hylo P F G (H (F X) E) H (G X)))) # TODO loop (de constantly (X) (list NIL (cons2 'quote X))) -#(de fmap (FF L) (foldr '((X Y) (cons2 (FF X) Y)) NIL L)) -(de fmap (FF L) (foldlx '((X Y) (cons2 (FF (car Y)))) NIL L)) -(de o @ (list (list 'X) (foldr '((FFF X) (list FFF X)) 'X (rest)))) -(de oq L (list (list 'X) (foldr '((FFF X) (list FFF X)) 'X L))) +(de fmap (F L) (foldlx '((X Y) (cons2 ((eval 'F 2) (car Y)))) NIL L)) # TODO use up +(de o @ (list (list 'X) (foldr '((F X) (list F X)) 'X (rest)))) +(de oq L (list (list 'X) (foldr '((F X) (list F X)) 'X L))) (def 'atom (oq not pair)) diff --git a/wl.java b/wl.java @@ -347,7 +347,7 @@ class wl implements Runnable { Any xrun(Any P, int n, Any L) { Any Z = NIL; - Any E = 0 < n ? undo(n, L) : NIL; + Any E = undo(n, L); try { if(P.isCons()) while(NIL != P) { @@ -361,7 +361,7 @@ class wl implements Runnable { Any xrun(Any P) {return xrun(P, 0, NIL);} Any eval(Any X, int n, Any L) { Any Z = NIL; - Any E = 0 < n ? undo(n, L) : NIL; + Any E = undo(n, L); try { if(X.isCons()) Z = apply(X); else if(X.isIsym()) Z = X.val(); @@ -376,7 +376,6 @@ class wl implements Runnable { Any F = eval(E.car()); 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.obj()).fn(E); else if(F.isObj()) Z = applyO(E, F); else err(E, "Don't know how to apply"); @@ -388,23 +387,28 @@ class wl implements Runnable { Any A = E.cdr(); Any Fa = F.car(); Any Fb = F.cdr(); - frame(); + Any B = NIL; if(Fa.isIsym()) { // (@ . P) | (L . P) | (NIL . P) if(NIL != Fa) { - if(At == Fa) bind(Args, mkCons(NIL, mapcarEval(A))); - else bind(Fa, A); + if(At == Fa) B = mkCons(mkCons(Args, mkCons(NIL, mapcarEval(A))), B); + else B = mkCons(mkCons(Fa, A), B); } } else if(Fa.isCons()) { // ((L ...) . P) while(Fa.isCons()) { - bind(Fa.car(), eval(A.car())); + B = mkCons(mkCons(Fa.car(), eval(A.car())), B); Fa = Fa.cdr(); A = A.cdr(); } if(NIL != Fa) { - if(At == Fa) bind(Args, mkCons(NIL, mapcarEval(A))); - else bind(Fa, A); + if(At == Fa) B = mkCons(mkCons(Args, mkCons(NIL, mapcarEval(A))), B); + else B = mkCons(mkCons(Fa, A), B); } } else err(Fa, "Don't know how to bind"); + frame(); + while(NIL != B) { + bind(B.car().car(), B.car().cdr()); + B = B.cdr(); + } try {Z = xrun(Fb);} finally {unframe();} return Z; @@ -543,29 +547,39 @@ 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()) { - Any C = E.car(); - // flip - Any F = E; - E = E.cdr(); - F.cdr(Z); - Z = F; - // swap - Any K = C.car(); - Any V = K.val(); - K.val(C.cdr()); - C.cdr(V); - } - if(T == E.car()) { - // flip - Any F = E; - E = E.cdr(); - F.cdr(Z); - Z = F; + // if(0 < n) { + // System.out.println(n); + // dbg("E+", E); + // dbg("*Stk", Stk.val()); + // } + for(int i = 0; i < n; i++) { + // System.out.println(i); + // dbg("Z", Z); + while(E.isCons() && T != E.car()) { + Any C = E.car(); + // flip + Any F = E; + E = E.cdr(); + F.cdr(Z); + Z = F; + // swap + Any K = C.car(); + Any V = K.val(); + K.val(C.cdr()); + C.cdr(V); + } + if(T == E.car()) { + // flip + Any F = E; + E = E.cdr(); + F.cdr(Z); + Z = F; + } } + // if(0 < n) dbg("E-", E); + //dbg("Z", Z); Env.val(E); return Z; }