commit 705745a59e9e838193c1c0a35feb97b6f121d0f1
parent ece72e5ae3a5298045be26bff225d3d6ae28b10a
Author: tomas <tomas@logand.com>
Date: Sun, 11 Oct 2009 14:22:26 +0200
=, ==, str?, num? impl; cond, nond + minor fixes
Diffstat:
M | java.wl | | | 23 | +++++++++++++++++++---- |
M | wl.java | | | 35 | +++++++++++++++++++++++++++++++---- |
2 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/java.wl b/java.wl
@@ -69,6 +69,21 @@
(pop 'L)
(T T (run L 1)) ) )
+(de cond L
+ (use X
+ (loop
+ (NIL L)
+ (setq X (pop 'L))
+ (T (eval (car X) 1) (up @ @) (run (cdr X) 1)) ) ) )
+
+(de nond L
+ (use X
+ (loop
+ (NIL L)
+ (setq X (pop 'L))
+ (NIL (eval (car X) 1) (run (cdr X) 1))
+ (up @ @) ) ) )
+
(de prog P (run P 1))
(de prog1 (E . P) (up @ E) (run P 1) E)
(de prog2 (E F . P) (up @ F) (run P 1) F)
@@ -153,7 +168,7 @@
(de jclass (N) (java.lang.Class 'forName N))
-(de gc () (((jclass 'java.lang.Runtime) 'getRuntime) 'gc))
+(de gc () (`((jclass 'java.lang.Runtime) 'getRuntime) 'gc))
(de import L
(let (P (pop 'L) C)
@@ -161,12 +176,10 @@
(setq C (pop 'L))
(def C (jclass (pack P "." C))) ) ) )
-(setq *Int (jclass 'java.math.BigInteger))
-
(de - L
(let? Z (eval (pop 'L) 1)
(ifn L
- ((jfield *Int 'ZERO) 'subtract Z)
+ (0 'subtract Z)
(loop
(NIL L Z)
(setq Y (eval (pop 'L) 1))
@@ -196,3 +209,5 @@
(setq Y (eval (pop 'L) 1))
(NIL Y)
(setq Z (Z 'reminder Y)) ) ) )
+
+(de + @ (- (pass - 0)))
diff --git a/wl.java b/wl.java
@@ -480,6 +480,14 @@ class wl implements Runnable {
}
Env.val(X);
}
+ boolean equal(Any X, Any Y) {
+ boolean z = true;
+ if(X.isCons()) z = equal(X.car(), Y.car()) && equal(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");
+ return z;
+ }
public wl() {
Sd.put("NIL", NIL);
@@ -543,8 +551,22 @@ class wl implements Runnable {
}
}});
fn("==", new Fn() {public Any fn(Any E) {
- Any X = E.cdr();
- return eval(X.car()) == eval(X.cdr().car()) ? T : NIL;
+ Any I = E.cdr();
+ if(I.isCons()) {
+ Any X = eval(I.car());
+ for(I = I.cdr(); I.isCons(); I = I.cdr())
+ if(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())
+ if(!equal(X, eval(I.car()))) return NIL;
+ }
+ return T;
}});
fn("peek", new Fn() {public Any fn(Any E) {
Character X = peek();
@@ -657,8 +679,13 @@ class wl implements Runnable {
return X.isCons() ? X : NIL;
}});
fn("sym?", new Fn() {public Any fn(Any E) {
- Any X = eval(E.cdr().car());
- return X.isSym() ? T : NIL;
+ return eval(E.cdr().car()).isSym() ? T : NIL;
+ }});
+ fn("str?", new Fn() {public Any fn(Any E) {
+ return eval(E.cdr().car()).isOstr() ? T : NIL;
+ }});
+ fn("num?", new Fn() {public Any fn(Any E) {
+ return eval(E.cdr().car()).isOnum() ? T : NIL;
}});
fn("let", new Fn() {public Any fn(Any E) {
Any Z = NIL;