wl

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

commit 95531fb330388effe89f9bfff315d59e60b59a2f
parent 2004f07abad444dbed83584edd10d32e4d3a227b
Author: tomas <tomas@logand.com>
Date:   Fri, 23 Oct 2009 20:38:17 +0200

comparison functions implemented

Diffstat:
Mjava.wl | 19+++++++++++++++++++
Mwl.java | 47++++++++++++++++++++++++++++++++++++++---------
2 files changed, 57 insertions(+), 9 deletions(-)

diff --git a/java.wl b/java.wl @@ -439,3 +439,22 @@ (de even (N) (= (% N 2) 0)) (def 'odd (oq not even)) + +(de lt0 (X) (and (num? X) (< X 0))) +(de gt0 (X) (and (num? X) (< 0 X))) +(de le0 (X) (and (num? X) (or (< X 0) (= 0 X)))) +(de ge0 (X) (and (num? X) (or (< 0 X) (= 0 X)))) + +(de foldln (F A L) + (let Z T + (loop + (NIL (and (pair L) (setq Z (F A (car L)))) Z) + (setq A (pop 'L)) ) ) ) +(de foldln1 (F L) (foldln F (pop 'L) L)) + +(de > @ (foldln1 '((X Y) (< Y X)) (rest))) +(de <= @ (foldln1 '((X Y) (or (< X Y) (= X Y))) (rest))) +(de >= @ (foldln1 '((X Y) (or (< Y X) (= X Y))) (rest))) +(de <> @ (not (pass =))) + +(de abs (N) (if (lt0 N) (- N) N)) diff --git a/wl.java b/wl.java @@ -586,12 +586,29 @@ class wl implements Runnable { } Env.val(X); } - boolean equal(Any X, Any Y) { + boolean eq(Any X, Any Y) { boolean z = true; - if(X.isCons()) z = equal(X.car(), Y.car()) && equal(X.cdr(), Y.cdr()); + if(X.isCons()) z = Y.isCons() && eq(X.car(), Y.car()) && eq(X.cdr(), Y.cdr()); else if(X.isSym()) z = Y.isSym() && X == Y; else if(X.isObj()) z = Y.isObj() && X.obj().equals(Y.obj()); - else err("Don't know how to equal"); + else err("Don't know how to eq"); + return z; + } + boolean lt(Any X, Any Y) { // (NIL 123 DEF "abc" (d e f) T) + boolean z = true; + if(NIL == Y || T == X) z = false; + else if(NIL == X || T == Y) z = true; + else if(X.isOnum()) + z = !Y.isOnum() || + ((BigInteger) X.obj()).compareTo((BigInteger) Y.obj()) < 0; + else if(X.isSym()) z = Y.isSym() ? X.nm().compareTo(Y.nm()) < 0 : !Y.isOnum(); + else if(X.isOstr()) + z = Y.isOstr() ? ((String) X.obj()).compareTo((String) Y.obj()) < 0 + : Y.isCons(); + else if(X.isCons()) + z = Y.isCons() && + (lt(X.car(), Y.car()) || eq(X.car(), Y.car()) && lt(X.cdr(), Y.cdr())); + else err("Don't know how to lt"); return z; } @@ -689,7 +706,19 @@ class wl implements Runnable { if(I.isCons()) { Any X = eval(I.car()); for(I = I.cdr(); I.isCons(); I = I.cdr()) - if(!equal(X, eval(I.car()))) return NIL; + if(!eq(X, eval(I.car()))) return NIL; + } + return T; + }}); + fn("<", new Fn() {public Any fn(Any E) { + Any I = E.cdr(); + if(I.isCons()) { + Any X = eval(I.car()); + for(I = I.cdr(); I.isCons(); I = I.cdr()) { + Any Y = eval(I.car()); + if(!lt(X, Y)) return NIL; + X = Y; + } } return T; }}); @@ -837,6 +866,9 @@ class wl implements Runnable { fn("num?", new Fn() {public Any fn(Any E) { return eval(E.cdr().car()).isOnum() ? T : NIL; }}); + fn("obj?", new Fn() {public Any fn(Any E) { + return eval(E.cdr().car()).isObj() ? T : NIL; + }}); fn("let", new Fn() {public Any fn(Any E) { Any Z = NIL; Any I = E.cdr(); @@ -1065,11 +1097,8 @@ class wl implements Runnable { Any F = I.car(); Any P = I.cdr(); Any Z = NIL; - try { - Z = xrun(P); - } finally { - eval(F); - } + try {Z = xrun(P);} + finally {eval(F);} return Z; }}); fn("read", new Fn() {public Any fn(Any E) { // TODO