commit 041254aceea82871d3a0ad9febdf8fb4b0f4415a
parent 79c81197b4023c9861f0655be2ebd0c23cc9e9a6
Author: tomas <tomas@logand.com>
Date: Thu, 8 Oct 2009 22:09:58 +0200
added: let, use, prin, pack
Diffstat:
M | wl.java | | | 109 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 109 insertions(+), 0 deletions(-)
diff --git a/wl.java b/wl.java
@@ -525,6 +525,34 @@ class wl implements Runnable {
}
return Z;
}});
+ fn("prin", new Fn() {public Any fn(Any E) {
+ PrintStream S = (PrintStream) Out.val().cxr();
+ Any Z = NIL;
+ int I = 0;
+ for(Any X = E.cdr(); NIL != X; X = X.cdr()) {
+ if(0 < I++) S.print(' ');
+ Z = eval(X.car());
+ prin(Z);
+ }
+ return Z;
+ }});
+ fn("pack", new Fn() {public Any fn(Any E) {
+ ByteArrayOutputStream B = new ByteArrayOutputStream();
+ PrintStream S = new PrintStream(B);
+ Any O = Out.val();
+ Out.val(mkObj(S));
+ for(Any X = E.cdr(); NIL != X; X = X.cdr())
+ prin(eval(X.car()));
+ Out.val(O);
+ String Z = null;
+ try {
+ Z = B.toString(Enc);
+ S.close();
+ } catch(UnsupportedEncodingException e) {
+ err(E, "Unsupported encoding " + Enc);
+ }
+ return mkObj(Z);
+ }});
// fn("in", new Fn() {public Any fn(Any E) {
// Any X = E.cdr;
@@ -635,6 +663,72 @@ class wl implements Runnable {
Any X = eval(E.cdr().car());
return X.isCons() ? X : NIL;
}});
+ fn("let", new Fn() {public Any fn(Any E) {
+ Any Z = NIL;
+ Any I = E.cdr();
+ Any L = I.car();
+ if(L.isCons()) {
+ Any A = L;
+ Any B = mkCons(NIL, NIL);
+ Any C = B;
+ while(A.isCons()) {
+ Any K = A.car();
+ A = A.cdr();
+ Any V = eval(A.car());
+ A = A.cdr();
+ C.cdr(mkCons(K.val(), NIL));
+ C = C.cdr();
+ K.val(V);
+ }
+ Z = xrun(I.cdr());
+ A = L;
+ C = B.cdr();
+ while(A.isCons()) {
+ Any K = A.car();
+ A = A.cdr().cdr();
+ K.val(C.car());
+ C = C.cdr();
+ }
+ } else if(L.isIsym()) {
+ I = I.cdr();
+ Any V = eval(I.car());
+ Any O = L.val();
+ L.val(V);
+ Z = xrun(I.cdr());
+ L.val(O);
+ } else err(E, "Don't know how to let");
+ return Z;
+ }});
+ fn("use", new Fn() {public Any fn(Any E) {
+ Any Z = NIL;
+ Any I = E.cdr();
+ Any L = I.car();
+ if(L.isCons()) {
+ Any A = L;
+ Any B = mkCons(NIL, NIL);
+ Any C = B;
+ while(A.isCons()) {
+ Any K = A.car();
+ A = A.cdr();
+ C.cdr(mkCons(K.val(), NIL));
+ C = C.cdr();
+ }
+ Z = xrun(I.cdr());
+ A = L;
+ C = B.cdr();
+ while(A.isCons()) {
+ Any K = A.car();
+ A = A.cdr();
+ K.val(C.car());
+ C = C.cdr();
+ }
+ } else if(L.isIsym()) {
+ Any O = L.val();
+ Z = xrun(I.cdr());
+ L.val(O);
+ } else err(E, "Don't know how to let");
+ return Z;
+ }});
fn("jnew", new Fn() {public Any fn(Any E) { // jnew 'cls [arg ...]
Any I = E.cdr();
@@ -739,6 +833,21 @@ class wl implements Runnable {
S.print(']');
} else err(E, "Don't know how to print");
}
+ Any prin(Any E) {
+ PrintStream S = (PrintStream) Out.val().cxr();
+ if(NIL == E);
+ else if(E.isCons()) {
+ Any X = E;
+ while(X.isCons()) {
+ prin(X.car());
+ X = X.cdr();
+ }
+ prin(X);
+ } else if(E.isIsym()) S.print(E.nm());
+ else if(E.isObj()) S.print(E.cxr());
+ else err(E, "Don't know how to print");
+ return E;
+ }
String str(Any E) {
ByteArrayOutputStream B = new ByteArrayOutputStream();