commit 1a486ace2896ec0a22da53dd1e61bdb7b6820555
parent bb91c7bce9646ff3a46db39023fceffeee771b66
Author: Alexander Burger <abu@software-lab.de>
Date:   Fri, 19 Jul 2013 14:09:51 +0200
Pilog Lisp call syntax with '^'
Diffstat:
22 files changed, 307 insertions(+), 261 deletions(-)
diff --git a/CHANGES b/CHANGES
@@ -1,4 +1,5 @@
 * DDsep13 picoLisp-3.1.4
+   Pilog Lisp call syntax with '^'
    'read' preserves trailing white space
 
 * 29jun13 picoLisp-3.1.3
diff --git a/doc/family.l b/doc/family.l
@@ -1,4 +1,4 @@
-# 11nov12abu
+# 19jul13abu
 # (c) Software Lab. Alexander Burger
 
 (load "@lib/http.l" "@lib/xhtml.l" "@lib/form.l" "@lib/ps.l")
@@ -152,8 +152,8 @@
                         @Fin (or (: home obj fin) (+ (: home obj dat) 36525))
                         (db dat +Person (@Beg . @Fin) @@)
                         (different @@ @Obj)
-                        (@ >= (get (-> @@) 'fin) (-> @Dat))
-                        (@ <= (get (-> @@) 'dat) (-> @Fin)) ) )
+                        (^ @ (>= (get (-> @@) 'fin) (-> @Dat)))
+                        (^ @ (<= (get (-> @@) 'dat) (-> @Fin))) ) )
                   7
                   '((This)
                      (list This (: job) (: dat) (: fin) (: pa) (: ma) (: mate)) ) )
diff --git a/doc/family.tgz b/doc/family.tgz
Binary files differ.
diff --git a/doc/family64.tgz b/doc/family64.tgz
Binary files differ.
diff --git a/doc/refM.html b/doc/refM.html
@@ -605,7 +605,7 @@ leaf ((Tree) (let (Node (cdr (root Tree)) X) (while (val Node) (setq X (cadr @) 
    *Dbg ((173 . "lib/btree.l"))
 
 nil 67284680
-   T (((@X) (@ not (-> @X))))
+   T (((@X) (^ @ (not (-> @X)))))
 .                                      # Stop
 -> T
 
diff --git a/doc/refR.html b/doc/refR.html
@@ -504,9 +504,9 @@ backtracking. See also <code><a href="refR.html#repeat">repeat</a></code> and
 
 <pre><code>
 : (be integer (@I)   # Generate unlimited supply of integers
-   (@C box 0)        # Init to zero
+   (^ @C (box 0))    # Init to zero
    (repeat)          # Repeat from here
-   (@I inc (-> @C)) )
+   (^ @I (inc (-> @C))) )
 -> integer
 
 : (? (integer @X))
diff --git a/doc/refT.html b/doc/refT.html
@@ -68,7 +68,7 @@ and <a href="ref.html#cmp">Comparing</a>.
 : (= 123 123)
 -> T
 : (get 'not T)
--> ((@P (1 -> @P) T (fail)) (@P))
+-> ((@P (1 (-> @P)) T (fail)) (@P))
 </code></pre>
 
 <dt><a name="This"><code>This</code></a>
diff --git a/doc/refU.html b/doc/refU.html
@@ -186,7 +186,7 @@ returns the new environment or <code>NIL</code> if not successful. See also
 href="ref_.html#->">-></a></code>.
 
 <pre><code>
-: (? (@A unify '(@B @C)))
+: (? (^ @A (unify '(@B @C))))
  @A=(((NIL . @C) 0 . @C) ((NIL . @B) 0 . @B) T)
 </code></pre>
 
diff --git a/doc/ref_.html b/doc/ref_.html
@@ -213,7 +213,7 @@ href="refP.html#prove">prove</a></code> and <code><a
 href="refU.html#unify">unify</a></code>.
 
 <pre><code>
-: (? (append (1 2 3) (4 5 6) @X) (@ println 'X '= (-> @X)))
+: (? (append (1 2 3) (4 5 6) @X) (^ @ (println 'X '= (-> @X))))
 X = (1 2 3 4 5 6)
  @X=(1 2 3 4 5 6)
 -> NIL
diff --git a/ersatz/fun.src b/ersatz/fun.src
@@ -1,4 +1,4 @@
-# 17jul13abu
+# 19jul13abu
 # (c) Software Lab. Alexander Burger
 
 # Ersatz PicoLisp Functions
@@ -2999,15 +2999,15 @@ prove (i x y)
          tp1 = x.Cdr;
       }
       else if (x.Car.Car instanceof Number) {
-         e = x.Car.Cdr.eval();
+         e = x.Car.Cdr.prog();
          for (i = ((Number)x.Car.Car).Cnt, x = Pnl;  --i > 0;)
             x = x.Cdr;
          Pnl = new Cell(x.Car, Pnl);
          tp2 = new Cell(tp1.Cdr, tp2);
          tp1 = e;
       }
-      else if (x.Car.Car instanceof Symbol && firstChar(x.Car.Car) == '@') {
-         if ((e = x.Car.Cdr.eval()) != Nil  && unify((Number)Pnl.Car, x.Car.Car, (Number)Pnl.Car, e))
+      else if (x.Car.Car == Up) {
+         if ((e = x.Car.Cdr.Cdr.prog()) != Nil  && unify((Number)Pnl.Car, x.Car.Cdr.Car, (Number)Pnl.Car, e))
             tp1 = x.Cdr;
          else {
             Penv = y.Car.Car;  y.Car = y.Car.Cdr;
diff --git a/ersatz/lib.l b/ersatz/lib.l
@@ -1,4 +1,4 @@
-# 04mar13abu
+# 19jul13abu
 # (c) Software Lab. Alexander Burger
 
 (setq *OS (java (java "java.lang.System" "getProperty" "os.name")))
@@ -875,19 +875,19 @@
 
 (be true)
 
-(be not @P (1 -> @P) T (fail))
+(be not @P (1 (-> @P)) T (fail))
 (be not @P)
 
 (be call @P
-   (2 cons (-> @P)) )
+   (2 (cons (-> @P))) )
 
-(be or @L (@C box (-> @L)) (_or @C))
+(be or @L (^ @C (box (-> @L))) (_or @C))
 
-(be _or (@C) (3 pop (-> @C)))
-(be _or (@C) (@ not (val (-> @C))) T (fail))
+(be _or (@C) (3 (pop (-> @C))))
+(be _or (@C) (^ @ (not (val (-> @C)))) T (fail))
 (repeat)
 
-(be nil (@X) (@ not (-> @X)))
+(be nil (@X) (^ @ (not (-> @X))))
 
 (be equal (@X @X))
 
@@ -910,55 +910,76 @@
    (permute @D @Y) )
 
 (be uniq (@B @X)
-   (@ not (idx (-> @B) (-> @X) T)) )
+   (^ @ (not (idx (-> @B) (-> @X) T))) )
 
-(be asserta (@C) (@ asserta (-> @C)))
+(be asserta (@C) (^ @ (asserta (-> @C))))
 
-(be assertz (@C) (@ assertz (-> @C)))
+(be assertz (@C) (^ @ (assertz (-> @C))))
 
 (be retract (@C)
-   (2 cons (-> @C))
-   (@ retract (list (car (-> @C)) (cdr (-> @C)))) )
+   (2 (cons (-> @C)))
+   (^ @ (retract (list (car (-> @C)) (cdr (-> @C))))) )
 
 (be clause ("@H" "@B")
-   ("@A" get (-> "@H") T)
+   (^ "@A" (get (-> "@H") T))
    (member "@B" "@A") )
 
-(be show (@X) (@ show (-> @X)))
+(be show (@X) (^ @ (show (-> @X))))
 
+(be for (@N @End) (for @N 1 @End 1))
+(be for (@N @Beg @End) (for @N @Beg @End 1))
+(be for (@N @Beg @End @Step) (equal @N @Beg))
+(be for (@N @Beg @End @Step)
+   (^ @I (box (-> @Beg)))
+   (_for @N @I @End @Step) )
+
+(be _for (@N @I @End @Step)
+   (^ @
+      (if (>= (-> @End) (val (-> @I)))
+         (> (inc (-> @I) (-> @Step)) (-> @End))
+         (> (-> @End) (dec (-> @I) (-> @Step))) ) )
+   T
+   (fail) )
+
+(be _for (@N @I @End @Step)
+   (^ @N (val (-> @I))) )
+
+(repeat)
 
 (be val (@V . @L)
-   (@V apply get (-> @L))
+   (^ @V (apply get (-> @L)))
    T )
 
 (be lst (@V . @L)
-   (@Lst box (apply get (-> @L)))
+   (^ @Lst (box (apply get (-> @L))))
    (_lst @V @Lst) )
 
-(be _lst (@Val @Lst) (@ not (val (-> @Lst))) T (fail))
-(be _lst (@Val @Lst) (@Val pop (-> @Lst)))
+(be _lst (@Val @Lst) (^ @ (not (val (-> @Lst)))) T (fail))
+(be _lst (@Val @Lst) (^ @Val (pop (-> @Lst))))
 (repeat)
 
 (be map (@V . @L)
-   (@Lst box (apply get (-> @L)))
+   (^ @Lst (box (apply get (-> @L))))
    (_map @V @Lst) )
 
-(be _map (@Val @Lst) (@ not (val (-> @Lst))) T (fail))
-(be _map (@Val @Lst) (@Val prog1 (val (-> @Lst)) (pop (-> @Lst))))
+(be _map (@Val @Lst) (^ @ (not (val (-> @Lst)))) T (fail))
+(be _map (@Val @Lst) (^ @Val (prog1 (val (-> @Lst)) (pop (-> @Lst)))))
 (repeat)
 
 
 (be isa (@Typ . @L)
-   (@ or
-      (not (-> @Typ))
-      (isa (-> @Typ) (apply get (-> @L))) ) )
+   (^ @
+      (or
+         (not (-> @Typ))
+         (isa (-> @Typ) (apply get (-> @L))) ) ) )
 
 (be same (@V . @L)
-   (@ let V (-> @V)
-      (or
-         (not V)
-         (let L (-> @L)
-            ("same" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let V (-> @V)
+         (or
+            (not V)
+            (let L (-> @L)
+               ("same" (car L) (cdr L)) ) ) ) ) )
 
 (de "same" (X L)
    (cond
@@ -975,16 +996,18 @@
       (T ("same" (apply get (car L) X) (cdr L))) ) )
 
 (be bool (@F . @L)
-   (@ or
-      (not (-> @F))
-      (apply get (-> @L)) ) )
+   (^ @
+      (or
+         (not (-> @F))
+         (apply get (-> @L)) ) ) )
 
 (be range (@N . @L)
-   (@ let N (-> @N)
-      (or
-         (not N)
-         (let L (-> @L)
-            ("range" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let N (-> @N)
+         (or
+            (not N)
+            (let L (-> @L)
+               ("range" (car L) (cdr L)) ) ) ) ) )
 
 (de "range" (X L)
    (cond
@@ -1008,11 +1031,12 @@
       (T ("range" (apply get (car L) X) (cdr L))) ) )
 
 (be head (@S . @L)
-   (@ let S (-> @S)
-      (or
-         (not S)
-         (let L (-> @L)
-            ("head" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let S (-> @S)
+         (or
+            (not S)
+            (let L (-> @L)
+               ("head" (car L) (cdr L)) ) ) ) ) )
 
 (de "head" (X L)
    (cond
@@ -1029,11 +1053,12 @@
       (T ("head" (apply get (car L) X) (cdr L))) ) )
 
 (be fold (@S . @L)
-   (@ let S (-> @S)
-      (or
-         (not S)
-         (let L (-> @L)
-            ("fold" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let S (-> @S)
+         (or
+            (not S)
+            (let L (-> @L)
+               ("fold" (car L) (cdr L)) ) ) ) ) )
 
 (de "fold" (X L)
    (cond
@@ -1051,11 +1076,12 @@
       (T ("fold" (apply get (car L) X) (cdr L))) ) )
 
 (be part (@S . @L)
-   (@ let S (-> @S)
-      (or
-         (not S)
-         (let L (-> @L)
-            ("part" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let S (-> @S)
+         (or
+            (not S)
+            (let L (-> @L)
+               ("part" (car L) (cdr L)) ) ) ) ) )
 
 (de "part" (X L)
    (cond
@@ -1073,11 +1099,12 @@
       (T ("part" (apply get (car L) X) (cdr L))) ) )
 
 (be tolr (@S . @L)
-   (@ let S (-> @S)
-      (or
-         (not S)
-         (let L (-> @L)
-            ("tolr" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let S (-> @S)
+         (or
+            (not S)
+            (let L (-> @L)
+               ("tolr" (car L) (cdr L)) ) ) ) ) )
 
 (de "tolr" (X L)
    (cond
@@ -1099,16 +1126,17 @@
 
 
 (be _remote ((@Obj . @))
-   (@ not (val (-> @Sockets 2)))
+   (^ @ (not (val (-> @Sockets 2))))
    T
    (fail) )
 
 (be _remote ((@Obj . @))
-   (@Obj let (Box (-> @Sockets 2)  Lst (val Box))
-      (rot Lst)
-      (loop
-         (T ((cdar Lst)) @)
-         (NIL (set Box (setq Lst (cdr Lst)))) ) ) )
+   (^ @Obj
+      (let (Box (-> @Sockets 2)  Lst (val Box))
+         (rot Lst)
+         (loop
+            (T ((cdar Lst)) @)
+            (NIL (set Box (setq Lst (cdr Lst)))) ) ) ) )
 
 (repeat)
 
diff --git a/ersatz/picolisp.jar b/ersatz/picolisp.jar
Binary files differ.
diff --git a/lib/map b/lib/map
@@ -6,7 +6,7 @@ $ (3023 . "@src64/flow.l")
 */ (2446 . "@src64/big.l")
 + (2171 . "@src64/big.l")
 - (2209 . "@src64/big.l")
--> (3929 . "@src64/subr.l")
+-> (3909 . "@src64/subr.l")
 / (2513 . "@src64/big.l")
 : (3060 . "@src64/sym.l")
 :: (3084 . "@src64/sym.l")
@@ -300,7 +300,7 @@ setq (1649 . "@src64/sym.l")
 sigio (493 . "@src64/main.l")
 size (2809 . "@src64/subr.l")
 skip (3531 . "@src64/io.l")
-sort (3978 . "@src64/subr.l")
+sort (3958 . "@src64/subr.l")
 sp? (727 . "@src64/sym.l")
 space (5104 . "@src64/io.l")
 split (1593 . "@src64/subr.l")
@@ -333,7 +333,7 @@ trim (1760 . "@src64/subr.l")
 try (1177 . "@src64/flow.l")
 type (920 . "@src64/flow.l")
 udp (304 . "@src64/net.l")
-unify (3951 . "@src64/subr.l")
+unify (3931 . "@src64/subr.l")
 unless (1901 . "@src64/flow.l")
 until (2085 . "@src64/flow.l")
 up (776 . "@src64/main.l")
diff --git a/lib/pilog.l b/lib/pilog.l
@@ -1,4 +1,4 @@
-# 09jul12abu
+# 19jul13abu
 # (c) Software Lab. Alexander Burger
 
 # *Rule
@@ -99,19 +99,19 @@
 
 (be true)
 
-(be not @P (1 -> @P) T (fail))
+(be not @P (1 (-> @P)) T (fail))
 (be not @P)
 
 (be call @P
-   (2 cons (-> @P)) )
+   (2 (cons (-> @P))) )
 
-(be or @L (@C box (-> @L)) (_or @C))
+(be or @L (^ @C (box (-> @L))) (_or @C))
 
-(be _or (@C) (3 pop (-> @C)))
-(be _or (@C) (@ not (val (-> @C))) T (fail))
+(be _or (@C) (3 (pop (-> @C))))
+(be _or (@C) (^ @ (not (val (-> @C)))) T (fail))
 (repeat)
 
-(be nil (@X) (@ not (-> @X)))
+(be nil (@X) (^ @ (not (-> @X))))
 
 (be equal (@X @X))
 
@@ -134,36 +134,39 @@
    (permute @D @Y) )
 
 (be uniq (@B @X)
-   (@ not (idx (-> @B) (-> @X) T)) )
+   (^ @ (not (idx (-> @B) (-> @X) T))) )
 
-(be asserta (@C) (@ asserta (-> @C)))
+(be asserta (@C) (^ @ (asserta (-> @C))))
 
-(be assertz (@C) (@ assertz (-> @C)))
+(be assertz (@C) (^ @ (assertz (-> @C))))
 
 (be retract (@C)
-   (2 cons (-> @C))
-   (@ retract (list (car (-> @C)) (cdr (-> @C)))) )
+   (2 (cons (-> @C)))
+   (^ @ (retract (list (car (-> @C)) (cdr (-> @C))))) )
 
 (be clause ("@H" "@B")
-   ("@A" get (-> "@H") T)
+   (^ "@A" (get (-> "@H") T))
    (member "@B" "@A") )
 
-(be show (@X) (@ show (-> @X)))
+(be show (@X) (^ @ (show (-> @X))))
 
 (be for (@N @End) (for @N 1 @End 1))
 (be for (@N @Beg @End) (for @N @Beg @End 1))
 (be for (@N @Beg @End @Step) (equal @N @Beg))
-(be for (@N @Beg @End @Step) (@I box (-> @Beg)) (_for @N @I @End @Step))
+(be for (@N @Beg @End @Step)
+   (^ @I (box (-> @Beg)))
+   (_for @N @I @End @Step) )
 
 (be _for (@N @I @End @Step)
-   (@ if (>= (-> @End) (val (-> @I)))
-      (> (inc (-> @I) (-> @Step)) (-> @End))
-      (> (-> @End) (dec (-> @I) (-> @Step))) )
+   (^ @
+      (if (>= (-> @End) (val (-> @I)))
+         (> (inc (-> @I) (-> @Step)) (-> @End))
+         (> (-> @End) (dec (-> @I) (-> @Step))) ) )
    T
    (fail) )
 
 (be _for (@N @I @End @Step)
-   (@N val (-> @I)) )
+   (^ @N (val (-> @I))) )
 
 (repeat)
 
@@ -215,79 +218,85 @@
 
 # (db var cls obj)
 (be db (@Var @Cls @Obj)
-   (@Q box
-      (with (or (get (-> @Cls) (-> @Var)) (meta (-> @Cls) (-> @Var)))
-         (initQuery (: var) (: cls) NIL '(NIL . T)) ) )
+   (^ @Q
+      (box
+         (with (or (get (-> @Cls) (-> @Var)) (meta (-> @Cls) (-> @Var)))
+            (initQuery (: var) (: cls) NIL '(NIL . T)) ) ) )
    (_db @Obj) )
 
 # (db var cls hook|val obj)
 (be db (@Var @Cls @X @Obj)
-   (@Q box
-      (with (or (get (-> @Cls) (-> @Var)) (meta (-> @Cls) (-> @Var)))
-         (cond
-            ((: hook)
-               (initQuery (: var) (: cls) (-> @X) '(NIL . T)) )
-            ((isa '+Fold This)
-               (initQuery (: var) (: cls) NIL (fold (-> @X))) )
-            (T
-               (initQuery (: var) (: cls) NIL (-> @X)) ) ) ) )
+   (^ @Q
+      (box
+         (with (or (get (-> @Cls) (-> @Var)) (meta (-> @Cls) (-> @Var)))
+            (cond
+               ((: hook)
+                  (initQuery (: var) (: cls) (-> @X) '(NIL . T)) )
+               ((isa '+Fold This)
+                  (initQuery (: var) (: cls) NIL (fold (-> @X))) )
+               (T
+                  (initQuery (: var) (: cls) NIL (-> @X)) ) ) ) ) )
    (_db @Obj) )
 
 # (db var cls hook val obj)
 (be db (@Var @Cls @Hook @Val @Obj)
-   (@Q box
-      (with (or (get (-> @Cls) (-> @Var)) (meta (-> @Cls) (-> @Var)))
-         (initQuery (: var) (: cls) (-> @Hook)
-            (if (isa '+Fold This)
-               (fold (-> @Val))
-               (-> @Val) ) ) ) )
+   (^ @Q
+      (box
+         (with (or (get (-> @Cls) (-> @Var)) (meta (-> @Cls) (-> @Var)))
+            (initQuery (: var) (: cls) (-> @Hook)
+               (if (isa '+Fold This)
+                  (fold (-> @Val))
+                  (-> @Val) ) ) ) ) )
    (_db @Obj) )
 
 (be _db (@Obj)
-   (@ let (Q (val (-> @Q 2))  Cls (-> @Cls 2))
-      (loop
-         (NIL (step Q (= '(NIL) (caaar Q))) T)
-         (T (isa Cls (setq "R" @))) ) )
+   (^ @
+      (let (Q (val (-> @Q 2))  Cls (-> @Cls 2))
+         (loop
+            (NIL (step Q (= '(NIL) (caaar Q))) T)
+            (T (isa Cls (setq "R" @))) ) ) )
    T
    (fail) )
 
-(be _db (@Obj) (@Obj . "R"))
+(be _db (@Obj) (^ @Obj "R"))
 
 (repeat)
 
 
 (be val (@V . @L)
-   (@V apply get (-> @L))
+   (^ @V (apply get (-> @L)))
    T )
 
 (be lst (@V . @L)
-   (@Lst box (apply get (-> @L)))
+   (^ @Lst (box (apply get (-> @L))))
    (_lst @V @Lst) )
 
-(be _lst (@Val @Lst) (@ not (val (-> @Lst))) T (fail))
-(be _lst (@Val @Lst) (@Val pop (-> @Lst)))
+(be _lst (@Val @Lst) (^ @ (not (val (-> @Lst)))) T (fail))
+(be _lst (@Val @Lst) (^ @Val (pop (-> @Lst))))
 (repeat)
 
 (be map (@V . @L)
-   (@Lst box (apply get (-> @L)))
+   (^ @Lst (box (apply get (-> @L))))
    (_map @V @Lst) )
 
-(be _map (@Val @Lst) (@ not (val (-> @Lst))) T (fail))
-(be _map (@Val @Lst) (@Val prog1 (val (-> @Lst)) (pop (-> @Lst))))
+(be _map (@Val @Lst) (^ @ (not (val (-> @Lst)))) T (fail))
+(be _map (@Val @Lst) (^ @Val (prog1 (val (-> @Lst)) (pop (-> @Lst)))))
 (repeat)
 
 
 (be isa (@Typ . @L)
-   (@ or
-      (not (-> @Typ))
-      (isa (-> @Typ) (apply get (-> @L))) ) )
+   (^ @
+      (or
+         (not (-> @Typ))
+         (isa (-> @Typ) (apply get (-> @L))) ) ) )
 
 (be same (@V . @L)
-   (@ let V (-> @V)
-      (or
-         (not V)
-         (let L (-> @L)
-            ("same" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let V (-> @V)
+         (or
+            (not V)
+            (let L (-> @L)
+               ("same" (car L) (cdr L)) ) ) ) ) )
 
 (de "same" (X L)
    (cond
@@ -304,16 +313,18 @@
       (T ("same" (apply get (car L) X) (cdr L))) ) )
 
 (be bool (@F . @L)
-   (@ or
-      (not (-> @F))
-      (apply get (-> @L)) ) )
+   (^ @
+      (or
+         (not (-> @F))
+         (apply get (-> @L)) ) ) )
 
 (be range (@N . @L)
-   (@ let N (-> @N)
-      (or
-         (not N)
-         (let L (-> @L)
-            ("range" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let N (-> @N)
+         (or
+            (not N)
+            (let L (-> @L)
+               ("range" (car L) (cdr L)) ) ) ) ) )
 
 (de "range" (X L)
    (cond
@@ -337,11 +348,12 @@
       (T ("range" (apply get (car L) X) (cdr L))) ) )
 
 (be head (@S . @L)
-   (@ let S (-> @S)
-      (or
-         (not S)
-         (let L (-> @L)
-            ("head" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let S (-> @S)
+         (or
+            (not S)
+            (let L (-> @L)
+               ("head" (car L) (cdr L)) ) ) ) ) )
 
 (de "head" (X L)
    (cond
@@ -358,11 +370,12 @@
       (T ("head" (apply get (car L) X) (cdr L))) ) )
 
 (be fold (@S . @L)
-   (@ let S (-> @S)
-      (or
-         (not S)
-         (let L (-> @L)
-            ("fold" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let S (-> @S)
+         (or
+            (not S)
+            (let L (-> @L)
+               ("fold" (car L) (cdr L)) ) ) ) ) )
 
 (de "fold" (X L)
    (cond
@@ -380,11 +393,12 @@
       (T ("fold" (apply get (car L) X) (cdr L))) ) )
 
 (be part (@S . @L)
-   (@ let S (-> @S)
-      (or
-         (not S)
-         (let L (-> @L)
-            ("part" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let S (-> @S)
+         (or
+            (not S)
+            (let L (-> @L)
+               ("part" (car L) (cdr L)) ) ) ) ) )
 
 (de "part" (X L)
    (cond
@@ -402,11 +416,12 @@
       (T ("part" (apply get (car L) X) (cdr L))) ) )
 
 (be tolr (@S . @L)
-   (@ let S (-> @S)
-      (or
-         (not S)
-         (let L (-> @L)
-            ("tolr" (car L) (cdr L)) ) ) ) )
+   (^ @
+      (let S (-> @S)
+         (or
+            (not S)
+            (let L (-> @L)
+               ("tolr" (car L) (cdr L)) ) ) ) ) )
 
 (de "tolr" (X L)
    (cond
@@ -505,39 +520,43 @@
       (T (step Q (= '(NIL) (caaar Q)))) ) )
 
 (be select (("@Obj" . "@X") . "@Lst")
-   (@ unify (-> "@X"))
-   ("@P" box (cdr (-> "@Lst")))
-   ("@C" box  # ((obj ..) curr . lst)
-      (let L (car (-> "@Lst"))
-         (setq L
-            (or
-               (mapcan "select" L)
-               ("select" (car L) T) ) )
-         (cons NIL L L) ) )
+   (^ @ (unify (-> "@X")))
+   (^ "@P" (box (cdr (-> "@Lst"))))
+   (^ "@C"
+      (box  # ((obj ..) curr . lst)
+         (let L (car (-> "@Lst"))
+            (setq L
+               (or
+                  (mapcan "select" L)
+                  ("select" (car L) T) ) )
+            (cons NIL L L) ) ) )
    (_gen "@Obj")
    (_sel) )
 
 (be _gen (@Obj)
-   (@ let C (caadr (val (-> "@C" 2)))
-      (not (setq "*R" (_gen (car C) (cdr C)))) )
+   (^ @
+      (let C (caadr (val (-> "@C" 2)))
+         (not (setq "*R" (_gen (car C) (cdr C)))) ) )
    T
    (fail) )
 
-(be _gen (@Obj) (@Obj . "*R"))
+(be _gen (@Obj) (^ @Obj "*R"))
 
 (repeat)
 
 (be _sel ()
-   (2 val (-> "@P" 2))
-   (@ let C (val (-> "@C" 2))
-      (unless (idx C "*R" T)
-         (rot (cddr C) (offset (cadr C) (cddr C)))
-         (set (cdr C) (cddr C)) ) )
+   (2 (val (-> "@P" 2)))
+   (^ @
+      (let C (val (-> "@C" 2))
+         (unless (idx C "*R" T)
+            (rot (cddr C) (offset (cadr C) (cddr C)))
+            (set (cdr C) (cddr C)) ) ) )
    T )
 
 (be _sel ()
-   (@ let C (cdr (val (-> "@C" 2)))
-      (set C (or (cdar C) (cdr C))) )
+   (^ @
+      (let C (cdr (val (-> "@C" 2)))
+         (set C (or (cdar C) (cdr C))) ) )
    (fail) )
 
 ### Remote queries ###
@@ -548,25 +567,27 @@
    (bye) )
 
 (be remote ("@Lst" . "@CL")
-   (@Sockets box
-      (prog1 (cdr (-> "@Lst"))
-         (for X @  # (out . in)
-            ((car X)
-               (cons 'rqry (car (-> "@Lst")) (-> "@CL")) ) ) ) )
-   (@ unify (car (-> "@Lst")))
+   (^ @Sockets
+      (box
+         (prog1 (cdr (-> "@Lst"))
+            (for X @  # (out . in)
+               ((car X)
+                  (cons 'rqry (car (-> "@Lst")) (-> "@CL")) ) ) ) ) )
+   (^ @ (unify (car (-> "@Lst"))))
    (_remote "@Lst") )
 
 (be _remote ((@Obj . @))
-   (@ not (val (-> @Sockets 2)))
+   (^ @ (not (val (-> @Sockets 2))))
    T
    (fail) )
 
 (be _remote ((@Obj . @))
-   (@Obj let (Box (-> @Sockets 2)  Lst (val Box))
-      (rot Lst)
-      (loop
-         (T ((cdar Lst)) @)
-         (NIL (set Box (setq Lst (cdr Lst)))) ) ) )
+   (^ @Obj
+      (let (Box (-> @Sockets 2)  Lst (val Box))
+         (rot Lst)
+         (loop
+            (T ((cdar Lst)) @)
+            (NIL (set Box (setq Lst (cdr Lst)))) ) ) ) )
 
 (repeat)
 
diff --git a/misc/hanoi.l b/misc/hanoi.l
@@ -1,4 +1,4 @@
-# 10nov04abu
+# 19jul13abu
 # (c) Software Lab. Alexander Burger
 
 # Lisp
@@ -18,7 +18,7 @@
 (be move (0 @ @ @) T)
 
 (be move (@N @A @B @C)
-   (@M - (-> @N) 1)
+   (^ @M (dec (-> @N)))
    (move @M @A @C @B)
-   (@ println 'Move 'disk 'from 'the (-> @A) 'to 'the (-> @B) 'pole)
+   (^ @ (println 'Move 'disk 'from 'the (-> @A) 'to 'the (-> @B) 'pole))
    (move @M @C @B @A) )
diff --git a/opt/pilog.l b/opt/pilog.l
@@ -0,0 +1,16 @@
+# 19jul13abu
+# (c) Software Lab. Alexander Burger
+
+(be mapcar (@ NIL NIL))
+(be mapcar (@P (@X . @L) (@Y . @M))
+   (call @P @X @Y)
+   (mapcar @P @L @M) )
+
+# Contributed by Clemens Hinze <cle-picolisp@qiao.in-berlin.de>
+(be findall (@Pat @P @Res)
+   (^ @Res
+      (solve
+         (-> @P)
+         (or @Pat (fill (-> @Pat))) ) ) )
+
+# vi:et:ts=3:sw=3
diff --git a/src/subr.c b/src/subr.c
@@ -1,4 +1,4 @@
-/* 17mar13abu
+/* 19jul13abu
  * (c) Software Lab. Alexander Burger
  */
 
@@ -1577,16 +1577,16 @@ any doProve(any x) {
          data(tp1) = cdr(x);
       }
       else if (isNum(caar(x))) {
-         data(e) = EVAL(cdar(x));
+         data(e) = prog(cdar(x));
          for (i = unDig(caar(x)), x = data(nl);  (i -= 2) > 0;)
             x = cdr(x);
          data(nl) = cons(car(x), data(nl));
          data(tp2) = cons(cdr(data(tp1)), data(tp2));
          data(tp1) = data(e);
       }
-      else if (isSym(caar(x)) && firstByte(caar(x)) == '@') {
-         if (!isNil(data(e) = EVAL(cdar(x)))  &&
-                     unify(car(data(nl)), caar(x), car(data(nl)), data(e)) )
+      else if (caar(x) == Up) {
+         if (!isNil(data(e) = prog(cddar(x)))  &&
+                     unify(car(data(nl)), cadar(x), car(data(nl)), data(e)) )
             data(tp1) = cdr(x);
          else {
             data(env) = caar(data(q)),  car(data(q)) = cdar(data(q));
diff --git a/src/vers.h b/src/vers.h
@@ -1 +1 @@
-static byte Version[4] = {3,1,3,4};
+static byte Version[4] = {3,1,3,5};
diff --git a/src64/subr.l b/src64/subr.l
@@ -1,4 +1,4 @@
-# 31mar13abu
+# 19jul13abu
 # (c) Software Lab. Alexander Burger
 
 # (car 'var) -> any
@@ -3693,7 +3693,8 @@
          ld (L V) ((L V) CDR)  # nl = cdr(nl)
          continue T
       end
-      cmp (X) TSym  # car(tp1) == T?
+      ld Y (X)  # car(tp1)
+      cmp Y TSym  # car(tp1) == T?
       if eq
          do
             ld C ((L IX))  # car(q)
@@ -3706,12 +3707,12 @@
          ld (L III) (X CDR)  # tp1 = cdr(tp1)
          continue T
       end
-      num ((X))  # caar(tp1) numeric?
+      num (Y)  # caar(tp1) numeric?
       if nz  # Yes
-         ld E ((X) CDR)  # Eval cdar(tp1)
-         eval
+         ld Z (Y CDR)  # Run Lisp body
+         prog Z
          ld (L I) E  # -> e
-         ld C ((X))  # Get count
+         ld C (Y)  # Get count
          shr C 4  # Normalize short
          ld A (L V)  # nl
          do
@@ -3730,50 +3731,29 @@
          ld (L III) (L I)  # tp1 = e
          continue T
       end
-      ld E ((X))  # caar(tp1)
-      sym E  # Symbolic?
-      if nz  # Yes
-         ld A (E TAIL)
-         call firstByteA_B  # starting with "@"?
-         cmp B (char "@")
-         if eq  # Yes
-            ld E ((X) CDR)  # Eval cdar(tp1)
-            eval
-            ld (L I) E  # -> e
-            cmp E Nil  # Any?
-            if ne  # Yes
-               ld C ((L V))  # car(nl)
-               ld Y ((X))  # caar(tp1)
-               ld E C  # car(nl)
-               ld Z (L I)  # e
-               call unifyCEYZ_F  # Match?
-               if eq  # Yes
-                  ld (L III) ((L III) CDR)  # tp1 = cdr(tp1)
-                  continue T
-               end
-            end
-            ld X (((L IX)))  # env = caar(q)
-            ld ((L IX)) (((L IX)) CDR)  # car(q) = cdar(q)
-            ld (L VI) (X)  # n = car(env)
-            ld X (X CDR)  # env = cdr(env)
-            ld (L V) (X)  # nl = car(env)
-            ld X (X CDR)  # env = cdr(env)
-            ld (L IV) (X)  # alt = car(env)
-            ld X (X CDR)  # env = cdr(env)
-            ld (L III) (X)  # tp1 = car(env)
-            ld X (X CDR)  # env = cdr(env)
-            ld (L II) (X)  # tp2 = car(env)
-            ld X (X CDR)  # env = cdr(env)
-            ld (L VII) X  # Set env
-            continue T
-         end
+      ld E (Y)  # caar(tp1)
+      cmp E Up  # Lisp call?
+      if eq  # Yes
+         ld Z ((Y CDR) CDR)  # Run Lisp body
+         prog Z
+         ld (L I) E  # -> e
+         cmp E Nil  # Any?
+         jeq 20  # No
+         ld C ((L V))  # car(nl)
+         ld Y ((Y CDR))  # cadar(tp1)
+         ld E C  # car(nl)
+         ld Z (L I)  # e
+         call unifyCEYZ_F  # Match?
+         jne 20  # No
+         ld (L III) ((L III) CDR)  # tp1 = cdr(tp1)
+         continue T
       end
       ld C TSym  # get(caar(tp1), T)
       call getEC_E
       ld (L IV) E  # -> alt
       atom E  # Atomic?
       if nz  # Yes
-         ld X (((L IX)))  # env = caar(q)
+20       ld X (((L IX)))  # env = caar(q)
          ld ((L IX)) (((L IX)) CDR)  # car(q) = cdar(q)
          ld (L VI) (X)  # n = car(env)
          ld X (X CDR)  # env = cdr(env)
diff --git a/src64/tags b/src64/tags
@@ -1238,14 +1238,14 @@ sys/x86-64.freeBsd.defs.l,1994
 fillE_FE3274,66981
 unifyCEYZ_F3377,69250
 doProve3543,73614
-lupCE_E3828,82084
-lookupCE_E3885,83475
-uniFillE_E3899,83728
-doArrow3929,84361
-doUnify3951,84771
-doSort3978,85259
-cmpDfltA_F4133,90440
-cmpUserAX_F4138,90591
+lupCE_E3808,81284
+lookupCE_E3865,82675
+uniFillE_E3879,82928
+doArrow3909,83561
+doUnify3931,83971
+doSort3958,84459
+cmpDfltA_F4113,89640
+cmpUserAX_F4118,89791
 
 ./net.l,192
 doPort5,96
diff --git a/src64/version.l b/src64/version.l
@@ -1,6 +1,6 @@
-# 17jul13abu
+# 19jul13abu
 # (c) Software Lab. Alexander Burger
 
-(de *Version 3 1 3 4)
+(de *Version 3 1 3 5)
 
 # vi:et:ts=3:sw=3
diff --git a/test/src/subr.l b/test/src/subr.l
@@ -1,4 +1,4 @@
-# 31mar13abu
+# 19jul13abu
 # (c) Software Lab. Alexander Burger
 
 ### c[ad]*r ###
@@ -496,12 +496,12 @@
 
 ### -> ###
 (test '((@A . 3) (@B . 7))
-   (prove (goal '(@A 3  (@B + 4 (-> @A))))) )
+   (prove (goal '(@A 3  (^ @B (+ 4 (-> @A)))))) )
 
 
 ### unify ###
 (test '((@A ((NIL . @C) 0 . @C) ((NIL . @B) 0 . @B) T))
-   (prove (goal '((@A unify '(@B @C))))) )
+   (prove (goal '((^ @A (unify '(@B @C)))))) )
 
 
 ### sort ###