commit 881b6d907563422acbf2f6b37a19f0d7ebcedb95
parent b2a3478a834c4e8127e34dd0d3526bd263fc9899
Author: tomas <tomas@logand.com>
Date:   Sat,  7 Nov 2009 01:07:20 +0100
cons2 jvector fix, added lit pwd dir info; jeq fix, added jv2l, err w/exception message
Diffstat:
| M | java.wl |  |  | 30 | +++++++++++++++++++++++++++--- | 
| M | wl.java |  |  | 32 | +++++++++++++++++++++++++++----- | 
2 files changed, 54 insertions(+), 8 deletions(-)
diff --git a/java.wl b/java.wl
@@ -168,7 +168,7 @@
 (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 (F L) (foldlx '((X Y) (cons2 ((eval 'F 2) (car Y)))) NIL L)) # TODO use up
+(de fmap (F L) (foldlx '((X Y) (cons2 ((up 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)))
 
@@ -180,7 +180,9 @@
 (de need (N L S) (unfoldl =0 (constantly S) 1- N)) # TODO L, -N
 
 (de cons @
-   (foldlx '((X Y) (if (pair (cdr Y)) (cons2 (car Y) (cdr Y)) (car Y))) NIL (rest)) )
+   (cons2 (next)
+      (foldlx '((X Y) (if (pair (cdr Y)) (cons2 (car Y) (cdr Y)) (car Y)))
+         NIL (rest) ) ) )
 
 (de and L
    (loop
@@ -483,7 +485,29 @@
 #(de exec () (`((jclass 'java.lang.Runtime) 'getRuntime) 'gc))
 
 (de jvector @
-   (let X (jnew (jclass 'java.util.Vector))
+   (let X (jnew `(jclass 'java.util.Vector))
       (while (args)
          (X 'add (next)) )
       X ) )
+
+(de lit (X) (if (atom X) X (cons 'quote X)))
+
+(de pwd () (`(jclass 'java.lang.System) 'getProperty "user.dir"))
+
+#(de jv2l (X)
+#   (let (A (`(jclass 'java.util.Arrays) 'asList X) L (cons) M L)
+#      (unless (jeq true (A 'isEmpty))
+#         (println A (A 'isEmpty))
+#         (setq M (con M (cons (A 'remove 0) NIL))) )
+#      (cdr L) ) )
+
+(de dir (X)
+   (filter '((X) (unless (= "." (car (chop X))) X))
+      (jv2l ((jnew `(jclass 'java.io.File) (or X ".")) 'list)) ) )
+
+(de info (X) # TODO proper date & time
+   (let F (jnew `(jclass 'java.io.File) (or X "."))
+      (and (jeq true (F 'exists))
+         (cons (or (jeq true (F 'isDirectory)) (jnum (F 'length)))
+            (jnum (F 'lastModified))
+            (jnum (F 'lastModified)) ) ) ) )
diff --git a/wl.java b/wl.java
@@ -22,6 +22,8 @@ import java.lang.reflect.InvocationHandler;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.Iterator;
 
 class wl implements Runnable {
 
@@ -62,6 +64,12 @@ class wl implements Runnable {
             throw new RuntimeException(M + ": " + str((Any) X));
         throw new RuntimeException(M + ": " + X);
     }
+    void err(Object X, Exception M) {
+        if(null != X && X instanceof Any)
+            throw
+                new RuntimeException(M + ":: " + M.getMessage() + ": " + str((Any) X));
+        throw new RuntimeException(M + ": " + X);
+    }
     static void err(String M) {throw new RuntimeException(M);}
 
     static public interface Fn {
@@ -575,9 +583,9 @@ class wl implements Runnable {
             Object r = m.invoke(o, methodArgs(m, aa));
             Z = mkObj(r);
         } catch(IllegalAccessException e) {
-            err(E, "IllegalAccessException");
+            err(E, e);
         } catch(InvocationTargetException e) {
-            err(E, "InvocationTargetException");
+            err(E, e);
         }
         return Z;
     }
@@ -1201,12 +1209,26 @@ class wl implements Runnable {
         fn("jeq", 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(X.obj() != eval(I.car()).obj()) return NIL;
+                Object A = eval(I.car()).obj();
+                for(I = I.cdr(); I.isCons(); I = I.cdr()) {
+                    Object B = eval(I.car()).obj();
+                    if(Boolean.TRUE.equals(A)) {
+                        if(!Boolean.TRUE.equals(B)) return NIL;
+                    } else if(Boolean.FALSE.equals(A)) {
+                        if(!Boolean.FALSE.equals(B)) return NIL;
+                    } else if(A != B) return NIL;
+                }
             }
             return T;
         }});
+        fn("jv2l", new Fn() {public Any fn(Any E) { // TODO in lisp!
+            Object[] x = (Object[]) eval(E.cdr().car()).obj();
+            Any Z = NIL;
+            if(null != x)
+                for(int i = x.length - 1; 0 <= i; i--)
+                    Z = mkCons(mkObj(x[i]), Z);
+            return Z;
+        }});
         fn("wait", new Fn() {public Any fn(Any E) { // wait ['cnt] . prg
             Any Z = NIL;
             // TODO poll from Que with timeout cnt unless run(prg)