From 297139c72a49366c9bcc4c5c18d5d5fdfb1c1497 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Sun, 31 Jan 2021 19:11:03 +0300 Subject: [PATCH] Return expression eliminated --- regression/orig/test030.log | 18 --------- regression/orig/test031.log | 14 ------- regression/orig/test032.log | 36 ----------------- regression/orig/test033.log | 2 - regression/orig/test035.log | 8 ---- regression/orig/test037.log | 6 --- regression/orig/test038.log | 12 ------ regression/orig/test039.log | 6 --- regression/orig/test043.log | 3 -- regression/orig/test044.log | 6 --- regression/orig/test047.log | 17 -------- regression/orig/test048.log | 3 -- regression/orig/test049.log | 3 -- regression/orig/test051.log | 8 ---- regression/orig/test052.log | 3 -- regression/orig/test053.log | 6 --- regression/orig/test055.log | 2 - regression/orig/test056.log | 1 - regression/orig/test057.log | 3 -- regression/orig/test058.log | 9 ----- regression/orig/test060.log | 5 --- regression/orig/test061.log | 2 - regression/orig/test062.log | 4 -- regression/orig/test064.log | 1 - regression/orig/test065.log | 2 - regression/orig/test066.log | 1 - regression/orig/test067.log | 1 - regression/orig/test068.log | 3 -- regression/orig/test069.log | 1 - regression/orig/test070.log | 1 - regression/orig/test071.log | 1 - regression/orig/test075.log | 2 - regression/orig/test076.log | 8 ---- regression/orig/test087.log | 6 --- regression/orig/test108.log | 1 - regression/test030.input | 1 - regression/test030.lama | 16 -------- regression/test031.input | 1 - regression/test031.lama | 16 -------- regression/test032.input | 1 - regression/test032.lama | 16 -------- regression/test033.input | 1 - regression/test033.lama | 17 -------- regression/test035.input | 1 - regression/test035.lama | 24 ----------- regression/test037.input | 1 - regression/test037.lama | 29 -------------- regression/test038.input | 1 - regression/test038.lama | 25 ------------ regression/test039.input | 1 - regression/test039.lama | 32 --------------- regression/test043.input | 1 - regression/test043.lama | 14 ------- regression/test044.input | 1 - regression/test044.lama | 39 ------------------ regression/test047.input | 1 - regression/test047.lama | 75 ----------------------------------- regression/test048.input | 1 - regression/test048.lama | 12 ------ regression/test049.input | 1 - regression/test049.lama | 23 ----------- regression/test051.input | 1 - regression/test051.lama | 31 --------------- regression/test052.input | 1 - regression/test052.lama | 26 ------------ regression/test053.input | 1 - regression/test053.lama | 41 ------------------- regression/test055.input | 0 regression/test055.lama | 8 ---- regression/test056.input | 3 -- regression/test056.lama | 8 ---- regression/test057.input | 1 - regression/test057.lama | 12 ------ regression/test058.input | 1 - regression/test058.lama | 23 ----------- regression/test060.input | 1 - regression/test060.lama | 19 --------- regression/test061.input | 1 - regression/test061.lama | 12 ------ regression/test062.input | 1 - regression/test062.lama | 22 ---------- regression/test064.input | 1 - regression/test064.lama | 5 --- regression/test065.input | 1 - regression/test065.lama | 23 ----------- regression/test066.input | 1 - regression/test066.lama | 13 ------ regression/test067.input | 1 - regression/test067.lama | 7 ---- regression/test068.input | 1 - regression/test068.lama | 19 --------- regression/test069.input | 1 - regression/test069.lama | 11 ----- regression/test070.input | 1 - regression/test070.lama | 15 ------- regression/test071.input | 1 - regression/test071.lama | 9 ----- regression/test075.input | 1 - regression/test075.lama | 17 -------- regression/test076.input | 1 - regression/test076.lama | 24 ----------- regression/test087.input | 1 - regression/test087.lama | 41 ------------------- regression/test108.input | 1 - regression/test108.lama | 8 ---- spec/lama-spec.tex | 2 +- src/Language.ml | 5 +-- src/SM.ml | 5 --- src/version.ml | 2 +- stdlib/Collection.lama | 48 +++++++++++----------- stdlib/regression/test03.lama | 2 +- stdlib/regression/test20.lama | 6 +-- stdlib/regression/test21.lama | 8 ++-- stdlib/regression/test23.lama | 4 +- 114 files changed, 37 insertions(+), 1018 deletions(-) delete mode 100644 regression/orig/test030.log delete mode 100644 regression/orig/test031.log delete mode 100644 regression/orig/test032.log delete mode 100644 regression/orig/test033.log delete mode 100644 regression/orig/test035.log delete mode 100644 regression/orig/test037.log delete mode 100644 regression/orig/test038.log delete mode 100644 regression/orig/test039.log delete mode 100644 regression/orig/test043.log delete mode 100644 regression/orig/test044.log delete mode 100644 regression/orig/test047.log delete mode 100644 regression/orig/test048.log delete mode 100644 regression/orig/test049.log delete mode 100644 regression/orig/test051.log delete mode 100644 regression/orig/test052.log delete mode 100644 regression/orig/test053.log delete mode 100644 regression/orig/test055.log delete mode 100644 regression/orig/test056.log delete mode 100644 regression/orig/test057.log delete mode 100644 regression/orig/test058.log delete mode 100644 regression/orig/test060.log delete mode 100644 regression/orig/test061.log delete mode 100644 regression/orig/test062.log delete mode 100644 regression/orig/test064.log delete mode 100644 regression/orig/test065.log delete mode 100644 regression/orig/test066.log delete mode 100644 regression/orig/test067.log delete mode 100644 regression/orig/test068.log delete mode 100644 regression/orig/test069.log delete mode 100644 regression/orig/test070.log delete mode 100644 regression/orig/test071.log delete mode 100644 regression/orig/test075.log delete mode 100644 regression/orig/test076.log delete mode 100644 regression/orig/test087.log delete mode 100644 regression/orig/test108.log delete mode 100644 regression/test030.input delete mode 100644 regression/test030.lama delete mode 100644 regression/test031.input delete mode 100644 regression/test031.lama delete mode 100644 regression/test032.input delete mode 100644 regression/test032.lama delete mode 100644 regression/test033.input delete mode 100644 regression/test033.lama delete mode 100644 regression/test035.input delete mode 100644 regression/test035.lama delete mode 100644 regression/test037.input delete mode 100644 regression/test037.lama delete mode 100644 regression/test038.input delete mode 100644 regression/test038.lama delete mode 100644 regression/test039.input delete mode 100644 regression/test039.lama delete mode 100644 regression/test043.input delete mode 100644 regression/test043.lama delete mode 100644 regression/test044.input delete mode 100644 regression/test044.lama delete mode 100644 regression/test047.input delete mode 100644 regression/test047.lama delete mode 100644 regression/test048.input delete mode 100644 regression/test048.lama delete mode 100644 regression/test049.input delete mode 100644 regression/test049.lama delete mode 100644 regression/test051.input delete mode 100644 regression/test051.lama delete mode 100644 regression/test052.input delete mode 100644 regression/test052.lama delete mode 100644 regression/test053.input delete mode 100644 regression/test053.lama delete mode 100644 regression/test055.input delete mode 100644 regression/test055.lama delete mode 100644 regression/test056.input delete mode 100644 regression/test056.lama delete mode 100644 regression/test057.input delete mode 100644 regression/test057.lama delete mode 100644 regression/test058.input delete mode 100644 regression/test058.lama delete mode 100644 regression/test060.input delete mode 100644 regression/test060.lama delete mode 100644 regression/test061.input delete mode 100644 regression/test061.lama delete mode 100644 regression/test062.input delete mode 100644 regression/test062.lama delete mode 100644 regression/test064.input delete mode 100644 regression/test064.lama delete mode 100644 regression/test065.input delete mode 100644 regression/test065.lama delete mode 100644 regression/test066.input delete mode 100644 regression/test066.lama delete mode 100644 regression/test067.input delete mode 100644 regression/test067.lama delete mode 100644 regression/test068.input delete mode 100644 regression/test068.lama delete mode 100644 regression/test069.input delete mode 100644 regression/test069.lama delete mode 100644 regression/test070.input delete mode 100644 regression/test070.lama delete mode 100644 regression/test071.input delete mode 100644 regression/test071.lama delete mode 100644 regression/test075.input delete mode 100644 regression/test075.lama delete mode 100644 regression/test076.input delete mode 100644 regression/test076.lama delete mode 100644 regression/test087.input delete mode 100644 regression/test087.lama delete mode 100644 regression/test108.input delete mode 100644 regression/test108.lama diff --git a/regression/orig/test030.log b/regression/orig/test030.log deleted file mode 100644 index 67af2524c..000000000 --- a/regression/orig/test030.log +++ /dev/null @@ -1,18 +0,0 @@ -> 9 -55 -8 -34 -7 -21 -6 -13 -5 -8 -4 -5 -3 -3 -2 -2 -1 -1 diff --git a/regression/orig/test031.log b/regression/orig/test031.log deleted file mode 100644 index 325578c16..000000000 --- a/regression/orig/test031.log +++ /dev/null @@ -1,14 +0,0 @@ -> 7 -5040 -6 -720 -5 -120 -4 -24 -3 -6 -2 -2 -1 -1 diff --git a/regression/orig/test032.log b/regression/orig/test032.log deleted file mode 100644 index 884b6b88a..000000000 --- a/regression/orig/test032.log +++ /dev/null @@ -1,36 +0,0 @@ -> 1 -2 -3 -4 -5 -6 -7 -8 -9 -2 -3 -4 -5 -6 -7 -8 -9 -10 -3 -5 -7 -9 -11 -13 -15 -17 -19 -5 -13 -29 -61 -125 -253 -509 -1021 -2045 diff --git a/regression/orig/test033.log b/regression/orig/test033.log deleted file mode 100644 index 923723a8f..000000000 --- a/regression/orig/test033.log +++ /dev/null @@ -1,2 +0,0 @@ -> 55 -15 diff --git a/regression/orig/test035.log b/regression/orig/test035.log deleted file mode 100644 index 439208742..000000000 --- a/regression/orig/test035.log +++ /dev/null @@ -1,8 +0,0 @@ -> 10 -20 -30 -40 -0 -1 -2 -3 diff --git a/regression/orig/test037.log b/regression/orig/test037.log deleted file mode 100644 index 58b322cfb..000000000 --- a/regression/orig/test037.log +++ /dev/null @@ -1,6 +0,0 @@ -> 5 -6 -7 -8 -9 -10 diff --git a/regression/orig/test038.log b/regression/orig/test038.log deleted file mode 100644 index 9876f9a7e..000000000 --- a/regression/orig/test038.log +++ /dev/null @@ -1,12 +0,0 @@ -> 1 -2 -3 -4 -1 -2 -3 -4 -3 -4 -1 -2 diff --git a/regression/orig/test039.log b/regression/orig/test039.log deleted file mode 100644 index c41010416..000000000 --- a/regression/orig/test039.log +++ /dev/null @@ -1,6 +0,0 @@ -> 1 -1 -1 -1 -0 -0 diff --git a/regression/orig/test043.log b/regression/orig/test043.log deleted file mode 100644 index c3c21fc91..000000000 --- a/regression/orig/test043.log +++ /dev/null @@ -1,3 +0,0 @@ -> 0 -100 -300 diff --git a/regression/orig/test044.log b/regression/orig/test044.log deleted file mode 100644 index 3484555d5..000000000 --- a/regression/orig/test044.log +++ /dev/null @@ -1,6 +0,0 @@ -> 1 -2 -3 -100 -200 -300 diff --git a/regression/orig/test047.log b/regression/orig/test047.log deleted file mode 100644 index b98c3e4e7..000000000 --- a/regression/orig/test047.log +++ /dev/null @@ -1,17 +0,0 @@ -> 1 -1 -1 -1 -1 -2 -3 -100 -3 -2 -1 -6 -5 -4 -3 -2 -1 diff --git a/regression/orig/test048.log b/regression/orig/test048.log deleted file mode 100644 index 9536400a4..000000000 --- a/regression/orig/test048.log +++ /dev/null @@ -1,3 +0,0 @@ -> 7 -7 -28 diff --git a/regression/orig/test049.log b/regression/orig/test049.log deleted file mode 100644 index 20b1d6a07..000000000 --- a/regression/orig/test049.log +++ /dev/null @@ -1,3 +0,0 @@ -> 55 -310 -310 diff --git a/regression/orig/test051.log b/regression/orig/test051.log deleted file mode 100644 index 1da1496d0..000000000 --- a/regression/orig/test051.log +++ /dev/null @@ -1,8 +0,0 @@ -> 0 -15 -15 -1 -2 -3 -4 -5 diff --git a/regression/orig/test052.log b/regression/orig/test052.log deleted file mode 100644 index c9c3fcf86..000000000 --- a/regression/orig/test052.log +++ /dev/null @@ -1,3 +0,0 @@ -> 1 -2 -3 diff --git a/regression/orig/test053.log b/regression/orig/test053.log deleted file mode 100644 index 2f9a3a65b..000000000 --- a/regression/orig/test053.log +++ /dev/null @@ -1,6 +0,0 @@ -> 1 -0 -1 -0 -1 -1 diff --git a/regression/orig/test055.log b/regression/orig/test055.log deleted file mode 100644 index 12decc137..000000000 --- a/regression/orig/test055.log +++ /dev/null @@ -1,2 +0,0 @@ -0 -3 diff --git a/regression/orig/test056.log b/regression/orig/test056.log deleted file mode 100644 index c910c5cfb..000000000 --- a/regression/orig/test056.log +++ /dev/null @@ -1 +0,0 @@ -> > > 8 diff --git a/regression/orig/test057.log b/regression/orig/test057.log deleted file mode 100644 index c03089ce6..000000000 --- a/regression/orig/test057.log +++ /dev/null @@ -1,3 +0,0 @@ -> 6 -7 -8 diff --git a/regression/orig/test058.log b/regression/orig/test058.log deleted file mode 100644 index e8398dcb2..000000000 --- a/regression/orig/test058.log +++ /dev/null @@ -1,9 +0,0 @@ -> 1 -2 -3 -2 -3 -4 -3 -4 -5 diff --git a/regression/orig/test060.log b/regression/orig/test060.log deleted file mode 100644 index a8d89ee1e..000000000 --- a/regression/orig/test060.log +++ /dev/null @@ -1,5 +0,0 @@ -> 1 -1 -1 -1 -0 diff --git a/regression/orig/test061.log b/regression/orig/test061.log deleted file mode 100644 index 8b665ccc8..000000000 --- a/regression/orig/test061.log +++ /dev/null @@ -1,2 +0,0 @@ -> 11 -18 diff --git a/regression/orig/test062.log b/regression/orig/test062.log deleted file mode 100644 index 3c41e142a..000000000 --- a/regression/orig/test062.log +++ /dev/null @@ -1,4 +0,0 @@ -> 5 -7 -12 --2 diff --git a/regression/orig/test064.log b/regression/orig/test064.log deleted file mode 100644 index 3af13cd74..000000000 --- a/regression/orig/test064.log +++ /dev/null @@ -1 +0,0 @@ -> 5 diff --git a/regression/orig/test065.log b/regression/orig/test065.log deleted file mode 100644 index a301ff37a..000000000 --- a/regression/orig/test065.log +++ /dev/null @@ -1,2 +0,0 @@ -> 2 -1 diff --git a/regression/orig/test066.log b/regression/orig/test066.log deleted file mode 100644 index 81f75865d..000000000 --- a/regression/orig/test066.log +++ /dev/null @@ -1 +0,0 @@ -> 35 diff --git a/regression/orig/test067.log b/regression/orig/test067.log deleted file mode 100644 index 5037637a6..000000000 --- a/regression/orig/test067.log +++ /dev/null @@ -1 +0,0 @@ -> 12 diff --git a/regression/orig/test068.log b/regression/orig/test068.log deleted file mode 100644 index a2a5aca89..000000000 --- a/regression/orig/test068.log +++ /dev/null @@ -1,3 +0,0 @@ -> 1 -800 -800 diff --git a/regression/orig/test069.log b/regression/orig/test069.log deleted file mode 100644 index d14b46a2c..000000000 --- a/regression/orig/test069.log +++ /dev/null @@ -1 +0,0 @@ -> 0 diff --git a/regression/orig/test070.log b/regression/orig/test070.log deleted file mode 100644 index d14b46a2c..000000000 --- a/regression/orig/test070.log +++ /dev/null @@ -1 +0,0 @@ -> 0 diff --git a/regression/orig/test071.log b/regression/orig/test071.log deleted file mode 100644 index 3af13cd74..000000000 --- a/regression/orig/test071.log +++ /dev/null @@ -1 +0,0 @@ -> 5 diff --git a/regression/orig/test075.log b/regression/orig/test075.log deleted file mode 100644 index 923723a8f..000000000 --- a/regression/orig/test075.log +++ /dev/null @@ -1,2 +0,0 @@ -> 55 -15 diff --git a/regression/orig/test076.log b/regression/orig/test076.log deleted file mode 100644 index 439208742..000000000 --- a/regression/orig/test076.log +++ /dev/null @@ -1,8 +0,0 @@ -> 10 -20 -30 -40 -0 -1 -2 -3 diff --git a/regression/orig/test087.log b/regression/orig/test087.log deleted file mode 100644 index 2f9a3a65b..000000000 --- a/regression/orig/test087.log +++ /dev/null @@ -1,6 +0,0 @@ -> 1 -0 -1 -0 -1 -1 diff --git a/regression/orig/test108.log b/regression/orig/test108.log deleted file mode 100644 index 9d66bc536..000000000 --- a/regression/orig/test108.log +++ /dev/null @@ -1 +0,0 @@ -> 100 diff --git a/regression/test030.input b/regression/test030.input deleted file mode 100644 index ec635144f..000000000 --- a/regression/test030.input +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/regression/test030.lama b/regression/test030.lama deleted file mode 100644 index ae4521f4f..000000000 --- a/regression/test030.lama +++ /dev/null @@ -1,16 +0,0 @@ -local n, i; - -fun fib (n) { - if n <= 1 - then return 1 - else - return (fib (n-1) + fib (n-2)) - fi -} - -n := read (); - -for i := n, i >= 1, i := i-1 do - write (i); - write (fib (i)) -od \ No newline at end of file diff --git a/regression/test031.input b/regression/test031.input deleted file mode 100644 index 7f8f011eb..000000000 --- a/regression/test031.input +++ /dev/null @@ -1 +0,0 @@ -7 diff --git a/regression/test031.lama b/regression/test031.lama deleted file mode 100644 index 319e962d1..000000000 --- a/regression/test031.lama +++ /dev/null @@ -1,16 +0,0 @@ -local n, i; - -fun fact (n) { - if n <= 1 - then return 1 - else - return (n * fact (n-1)) - fi -} - -n := read (); - -for i := n, i >= 1, i := i-1 do - write (i); - write (fact (i)) -od \ No newline at end of file diff --git a/regression/test032.input b/regression/test032.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test032.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test032.lama b/regression/test032.lama deleted file mode 100644 index b5bd95e5f..000000000 --- a/regression/test032.lama +++ /dev/null @@ -1,16 +0,0 @@ -local x, m, n; - -fun ack (m, n) { - if m == 0 then return (n+1) - elif m > 0 && n == 0 then return ack (m-1, 1) - else return ack (m-1, ack (m, n-1)) - fi -} - -x := read (); - -for m := 0, m <= 3, m := m+1 do - for n := 0, n <= 8, n := n+1 do - write (ack (m, n)) - od -od \ No newline at end of file diff --git a/regression/test033.input b/regression/test033.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test033.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test033.lama b/regression/test033.lama deleted file mode 100644 index d591fc46e..000000000 --- a/regression/test033.lama +++ /dev/null @@ -1,17 +0,0 @@ -local x; - -fun test (n, m) { - local i, s; - s := 0; - for i := 0, i <= n, i := i + 1 do - s := s + i; - if s > m then return s fi - od; - - return s -} - -x := read (); - -write (test (10, 100)); -write (test (100, 10)) \ No newline at end of file diff --git a/regression/test035.input b/regression/test035.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test035.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test035.lama b/regression/test035.lama deleted file mode 100644 index f46e0de77..000000000 --- a/regression/test035.lama +++ /dev/null @@ -1,24 +0,0 @@ -local n, x, i; - -fun printArray (x) { - local elem; - if x.length == 0 then return fi; - for i:=0, i return y - | Cons (h, t) -> return Cons (h, append (t, y)) - esac -} - -fun printList (x) { - case x of - Nil -> skip - | Cons (h, t) -> write (h); printList (t) - esac -} - -n := read (); - -x := Cons (1, Cons (2, Nil)); -y := Cons (3, Cons (4, Nil)); - -printList (x); -printList (y); -printList (append (x, y)); -printList (append (y, x)) diff --git a/regression/test039.input b/regression/test039.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test039.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test039.lama b/regression/test039.lama deleted file mode 100644 index 0e14f2499..000000000 --- a/regression/test039.lama +++ /dev/null @@ -1,32 +0,0 @@ -local n, t; - -fun insert (t, x) { - case t of - Leaf -> return Node (x, Leaf, Leaf) - | Node (y, l, r) -> if x > y - then return Node (y, insert (l, x), r) - else return Node (y, l, insert (r, x)) - fi - esac -} - -fun find (t, x) { - case t of - Leaf -> return 0 - | Node (y, l, r) -> if x == y then return 1 - elif x > y then return find (l, x) - else return find (r, x) - fi - esac -} - -n := read (); - -t := insert (insert (insert (insert (Leaf, 5), 4), 6), 3); - -write (find (t, 5)); -write (find (t, 4)); -write (find (t, 6)); -write (find (t, 3)); -write (find (t, 2)); -write (find (t, 1)) diff --git a/regression/test043.input b/regression/test043.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test043.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test043.lama b/regression/test043.lama deleted file mode 100644 index 801a0f11e..000000000 --- a/regression/test043.lama +++ /dev/null @@ -1,14 +0,0 @@ -local x; - -fun sum (x) { - case x of - Nil -> return 0 - | Cons (x, tl) -> return (x + sum (tl)) - esac -} - -x := read (); - -write (sum (Nil)); -write (sum (Cons (100, Nil))); -write (sum (Cons (100, Cons (200, Nil)))) \ No newline at end of file diff --git a/regression/test044.input b/regression/test044.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test044.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test044.lama b/regression/test044.lama deleted file mode 100644 index dc9d8b4c0..000000000 --- a/regression/test044.lama +++ /dev/null @@ -1,39 +0,0 @@ -local x, y, z; - -fun zip (x) { - case x of Pair (x, y) -> - case x of - Nil -> return Nil - | Cons (x, xs) -> case y of - Nil -> return Nil - | Cons (y, ys) -> return Cons (Pair (x, y), zip (Pair (xs, ys))) - esac - esac - esac -} - -fun unzip (x) { - case x of - Nil -> return Pair (Nil, Nil) - | Cons (Pair (x, y), tl) -> - case unzip (tl) of - Pair (xs, ys) -> return Pair (Cons (x, xs), Cons (y, ys)) - esac - esac -} - -fun printList (l) { - case l of - Nil -> skip - | Cons (x, xs) -> write (x); printList (xs) - esac -} - -z := read (); - -x := Cons (1, Cons (2, Cons (3, Nil))); -y := Cons (100, Cons (200, Cons (300, Nil))); - -case unzip (zip (Pair (x, y))) of - Pair (x, y) -> printList (x); printList (y) -esac \ No newline at end of file diff --git a/regression/test047.input b/regression/test047.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test047.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test047.lama b/regression/test047.lama deleted file mode 100644 index d42827eca..000000000 --- a/regression/test047.lama +++ /dev/null @@ -1,75 +0,0 @@ -local n; - -fun collect_ints_acc (v, tail) { - local i; - case v of - a@#unboxed -> return Cons (a, tail) - | #string -> return tail - | _ -> - for i := 0, i < v.length, i := i + 1 do - tail := collect_ints_acc (v[i], tail) - od; - return tail - esac -} - -fun collect_ints (v) { - return collect_ints_acc (v, Nil) -} - -fun print_list (l) { - case l of - Nil -> skip - | Cons (n, t) -> write (n); print_list (t) - esac -} - -n := read (); - -case 1 of - 5 -> write (5) -| 4 -> write (4) -| 3 -> write (3) -| 2 -> write (2) -| 1 -> write (1) -| 0 -> write (0) -esac; - -case 1 of - a@5 -> write (a) -| a@4 -> write (a) -| a@3 -> write (a) -| a@2 -> write (a) -| a@1 -> write (a) -| a@0 -> write (a) -esac; - -case A (1, 2, 3) of - A (1, 3, 5) -> write (0) -| A (3, 4, 5) -> write (0) -| A (1, 2, 3) -> write (1) -| A (6, 7, 8) -> write (0) -esac; - -case "abc" of - "def" -> write (0) -| "ab" -> write (0) -| "abc" -> write (1) -| "" -> write (0) -esac; - -case [1, 2, 3] of - [] -> write (0) -| [a, b] -> write (0) -| [a, b, c] -> write (a); write (b); write (c) -| [_, _, _] -> write (0) -esac; - -case [1, 2, 3] of - [] -> write (0) -| [a, b] -> write (0) -| [_, _, _] -> write (100) -| [a, b, c] -> write (a); write (b); write (c) -esac; - -print_list (collect_ints ([1, 2, 3, [4, 5, 6, Cons (1, 2, 3)]])) diff --git a/regression/test048.input b/regression/test048.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test048.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test048.lama b/regression/test048.lama deleted file mode 100644 index f7e3f7ceb..000000000 --- a/regression/test048.lama +++ /dev/null @@ -1,12 +0,0 @@ -local n, y; - -fun test (n, m) { - local i, s; - write (n); - write (m); - return n -} - -n := read (); -y := 1 + (2 + (3 + (4 + (5 + (6 + test (7, 7)))))); -write (y) \ No newline at end of file diff --git a/regression/test049.input b/regression/test049.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test049.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test049.lama b/regression/test049.lama deleted file mode 100644 index 05550ff76..000000000 --- a/regression/test049.lama +++ /dev/null @@ -1,23 +0,0 @@ -local n, y, y2, t; - -fun test (n, m) { - local i, s; - s := 0; - for i := 0, i <= n, i := i + 1 do - s := s + i; - if s > m then return s fi - od; - - return s -} - -n := read (); -y := ((((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))))) + ((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))))) + (((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))))) + ((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + test(10, 100))))))))); - -t := test (10, 100); -y2 := ((((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))))) + ((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))))) + (((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))))) + ((((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))))) + (((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)))) + ((((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1))) + (((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + t)))))))); - -write (t); -write (y2); -write (y) - diff --git a/regression/test051.input b/regression/test051.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test051.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test051.lama b/regression/test051.lama deleted file mode 100644 index fdf03c08f..000000000 --- a/regression/test051.lama +++ /dev/null @@ -1,31 +0,0 @@ -local n; - -fun sum (l) { - case l of - {} -> return 0 - | h : t -> return (h + sum (t)) - esac -} - -fun print_list (l) { - case l of - {} -> skip - | h : t -> write (h); print_list (t) - esac -} - -fun array_to_list (a) { - local l, i; - l := {}; - for i := a.length, i > 0, i := i-1 do - l := a[i-1] : l - od; - return l -} - -n := read (); -write (sum ({})); -write (sum ({1, 2, 3, 4, 5})); -write (sum (1:2:3:4:5:{})); -print_list (array_to_list ([1, 2, 3, 4, 5])) - diff --git a/regression/test052.input b/regression/test052.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test052.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test052.lama b/regression/test052.lama deleted file mode 100644 index 2c24109af..000000000 --- a/regression/test052.lama +++ /dev/null @@ -1,26 +0,0 @@ -local n; - -fun hd (l) { - case l of - h : _ -> return h - esac -} - - -fun tl (l) { - case l of - _ : tl -> return tl - esac -} - -fun print_list (l) { - case l of - {} -> skip - | h : t -> write (h); print_list (t) - esac -} - -n := read (); -write ({1, 2, 3}.hd); -print_list ({1, 2, 3}.tl) - diff --git a/regression/test053.input b/regression/test053.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test053.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test053.lama b/regression/test053.lama deleted file mode 100644 index da09c0534..000000000 --- a/regression/test053.lama +++ /dev/null @@ -1,41 +0,0 @@ -local n; - -infix === at == (v1, v2) { - local s1, s2, i; - - s1 := v1.string; - s2 := v2.string; - - if s1.length == s2.length - then - for i := 0, i < s1.length, i := i + 1 - do - if s1[i] != s2[i] then return 0 fi - od; - return 1 - else return 0 - fi -} - -infix ? before + (v, l) { - case l of - {} -> return 0 - | h : tl -> if h === v then return 1 else return (v ? tl) fi - esac -} - -infix +++ at + (l1, l2) { - case l1 of - {} -> return l2 - | h : tl -> return (h : tl +++ l2) - esac -} - -n := read (); - -write ({1, 2, 3} === {1, 2, 3}); -write ({1, 2, 3} === {1, 2, 4}); -write (1+2 ? {1, 2, 3}); -write (1*3+2 ? {1, 2, 3}); -write (1*3+2 ? {1, 2, 5}); -write (8*4 ? {1, 2, 3} +++ {5, 7, 32, 6}) diff --git a/regression/test055.input b/regression/test055.input deleted file mode 100644 index e69de29bb..000000000 diff --git a/regression/test055.lama b/regression/test055.lama deleted file mode 100644 index 00b21a292..000000000 --- a/regression/test055.lama +++ /dev/null @@ -1,8 +0,0 @@ -fun len(l) { - case l of - _ : xs -> return len(xs) + 1 - |{} -> return 0 - esac -} -write(len({})); -write(len({1, 2, 3})) \ No newline at end of file diff --git a/regression/test056.input b/regression/test056.input deleted file mode 100644 index 01e79c32a..000000000 --- a/regression/test056.input +++ /dev/null @@ -1,3 +0,0 @@ -1 -2 -3 diff --git a/regression/test056.lama b/regression/test056.lama deleted file mode 100644 index 164983f23..000000000 --- a/regression/test056.lama +++ /dev/null @@ -1,8 +0,0 @@ -fun test (a, b, c) { - local x = a + b, y = b + c; - {local e = x + y; - return e - } -} - -write (test (read (), read (), read ())) \ No newline at end of file diff --git a/regression/test057.input b/regression/test057.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test057.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test057.lama b/regression/test057.lama deleted file mode 100644 index 3b142076a..000000000 --- a/regression/test057.lama +++ /dev/null @@ -1,12 +0,0 @@ -fun a (x) {return x + 1} -fun b (x) {return x + 2} -fun c (x) {return x + 3} - -{ - local funs = [a, b, c]; - local n = read (), i; - - for i := 0, i < 3, i := i+1 do - write (funs[i] (n)) - od -} \ No newline at end of file diff --git a/regression/test058.input b/regression/test058.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test058.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test058.lama b/regression/test058.lama deleted file mode 100644 index b77010f70..000000000 --- a/regression/test058.lama +++ /dev/null @@ -1,23 +0,0 @@ -fun map (f, l) { - case l of - {} -> return {} - | h : tl -> return (f (h) : map (f, tl)) - esac -} - -fun a (x) {return x + 1} -fun b (x) {return x + 2} - -fun print_list (x) { - case x of - {} -> skip - | h : tl -> write (h); print_list (tl) - esac -} - -local x = read (); - -print_list ({1, 2, 3}); -print_list (map (a, {1, 2, 3})); -print_list (map (b, {1, 2, 3})) - diff --git a/regression/test060.input b/regression/test060.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test060.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test060.lama b/regression/test060.lama deleted file mode 100644 index 7b4069731..000000000 --- a/regression/test060.lama +++ /dev/null @@ -1,19 +0,0 @@ -fun f (l) { - infix === at == (a, b) { - return a == b - } - - case l of - {} -> return 1 - | {_} -> return 1 - | a : b : tl -> return a === b && f (b : tl) - esac -} - -local x = read (); - -write (f ({})); -write (f (1:{})); -write (f ({1, 1})); -write (f ({1, 1, 1})); -write (f ({1, 2, 1})) diff --git a/regression/test061.input b/regression/test061.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test061.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test061.lama b/regression/test061.lama deleted file mode 100644 index bd4a08909..000000000 --- a/regression/test061.lama +++ /dev/null @@ -1,12 +0,0 @@ -fun plus (x) { - fun f (y) { - return x + y - } - - return f -} - -local x = read (); - -write (plus(5)(6)); -write (plus(8)(10)) \ No newline at end of file diff --git a/regression/test062.input b/regression/test062.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test062.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test062.lama b/regression/test062.lama deleted file mode 100644 index 080dcd92a..000000000 --- a/regression/test062.lama +++ /dev/null @@ -1,22 +0,0 @@ -fun a (x, y) { - local a = x + y, b = x - y; - { - local f = fun () { - write (x); - write (y); - write (a); - write (b) - }; - - a := 100; - b := 200; - x := 800; - y := 1000; - - return f - } -} - -local x = read (); - -a (5, 7) () \ No newline at end of file diff --git a/regression/test064.input b/regression/test064.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test064.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test064.lama b/regression/test064.lama deleted file mode 100644 index 114923597..000000000 --- a/regression/test064.lama +++ /dev/null @@ -1,5 +0,0 @@ -infix ++ at + (a, b) {return a+b} - -local x = read (); - -write (infix ++ (2, 3)) \ No newline at end of file diff --git a/regression/test065.input b/regression/test065.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test065.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test065.lama b/regression/test065.lama deleted file mode 100644 index 5598a5d9c..000000000 --- a/regression/test065.lama +++ /dev/null @@ -1,23 +0,0 @@ -fun f () { - local x, l = {}; - fun g () {return x} - - x := 1; - l := g : l; - - x := 2; - l := g : l; - - return l -} - -fun p (l) { - case l of - {} -> skip - | h : tl -> write (h ()); p (tl) - esac -} - -local x = read (); - -p (f ()) \ No newline at end of file diff --git a/regression/test066.input b/regression/test066.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test066.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test066.lama b/regression/test066.lama deleted file mode 100644 index 75dce5f13..000000000 --- a/regression/test066.lama +++ /dev/null @@ -1,13 +0,0 @@ -fun f (a) { - fun g (b) { - fun h (c) { - return fun (x) {return x + a + b + c} - } - return h (b) - } - return g (a) -} - -local x = read (); - -write (f(10)(5)) \ No newline at end of file diff --git a/regression/test067.input b/regression/test067.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test067.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test067.lama b/regression/test067.lama deleted file mode 100644 index 943bee593..000000000 --- a/regression/test067.lama +++ /dev/null @@ -1,7 +0,0 @@ -infixr ** before * (f, g) { - return fun (x) {return f (g (x))} -} - -local x = read (); - -write ((fun (x) {return x+2} ** fun (x) {return x+3})(7)) \ No newline at end of file diff --git a/regression/test068.input b/regression/test068.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test068.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test068.lama b/regression/test068.lama deleted file mode 100644 index 14709b3c9..000000000 --- a/regression/test068.lama +++ /dev/null @@ -1,19 +0,0 @@ -fun makeLazy (f) { - local flag = 0, value = 0; - - return fun () { - if flag - then return value - else - value := f (); - flag := 1; - return value - fi - } -} - -local l = makeLazy (fun () {write (1); return 800}); -local x = read (); - -write (l ()); -write (l ()) \ No newline at end of file diff --git a/regression/test069.input b/regression/test069.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test069.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test069.lama b/regression/test069.lama deleted file mode 100644 index 03c66ad08..000000000 --- a/regression/test069.lama +++ /dev/null @@ -1,11 +0,0 @@ -fun f (x) { - fun inner (y) { - return if y == 0 then 0 else inner (y-1) fi - } - - return inner (x) -} - -local n = read (); - -write (f (5)) \ No newline at end of file diff --git a/regression/test070.input b/regression/test070.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test070.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test070.lama b/regression/test070.lama deleted file mode 100644 index 602a9984b..000000000 --- a/regression/test070.lama +++ /dev/null @@ -1,15 +0,0 @@ -fun f (x) { - fun inner1 (y) { - return if y == 0 then 0 else inner2 (y-1) fi - } - - fun inner2 (y) { - return if y == 0 then 0 else inner1 (y-1) fi - } - - return inner1 (x) -} - -local n = read (); - -write (f (5)) \ No newline at end of file diff --git a/regression/test071.input b/regression/test071.input deleted file mode 100644 index 7ed6ff82d..000000000 --- a/regression/test071.input +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/regression/test071.lama b/regression/test071.lama deleted file mode 100644 index 5f615d8c3..000000000 --- a/regression/test071.lama +++ /dev/null @@ -1,9 +0,0 @@ -fun f (x) { - fun g () {return x} - fun h () {return g} - return g -} - -local n = read (); - -write (f(5)()) \ No newline at end of file diff --git a/regression/test075.input b/regression/test075.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test075.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test075.lama b/regression/test075.lama deleted file mode 100644 index 240edc562..000000000 --- a/regression/test075.lama +++ /dev/null @@ -1,17 +0,0 @@ -local x; - -fun test (n, m) { - local i, s; - s := 0; - for i := 0, i <= n, i := i + 1 do - s := s + i; - if s > m then return s fi - od; - - s -} - -x := read (); - -write (test (10, 100)); -write (test (100, 10)) \ No newline at end of file diff --git a/regression/test076.input b/regression/test076.input deleted file mode 100644 index 573541ac9..000000000 --- a/regression/test076.input +++ /dev/null @@ -1 +0,0 @@ -0 diff --git a/regression/test076.lama b/regression/test076.lama deleted file mode 100644 index f46e0de77..000000000 --- a/regression/test076.lama +++ /dev/null @@ -1,24 +0,0 @@ -local n, x, i; - -fun printArray (x) { - local elem; - if x.length == 0 then return fi; - for i:=0, i 0 - | h : tl -> if h === v then 1 else (v ? tl) fi - esac -} - -infix +++ at + (l1, l2) { - case l1 of - {} -> l2 - | h : tl -> (h : tl +++ l2) - esac -} - -n := read (); - -write ({1, 2, 3} === {1, 2, 3}); -write ({1, 2, 3} === {1, 2, 4}); -write (1+2 ? {1, 2, 3}); -write (1*3+2 ? {1, 2, 3}); -write (1*3+2 ? {1, 2, 5}); -write (8*4 ? {1, 2, 3} +++ {5, 7, 32, 6}) diff --git a/regression/test108.input b/regression/test108.input deleted file mode 100644 index 29d6383b5..000000000 --- a/regression/test108.input +++ /dev/null @@ -1 +0,0 @@ -100 diff --git a/regression/test108.lama b/regression/test108.lama deleted file mode 100644 index da500f55a..000000000 --- a/regression/test108.lama +++ /dev/null @@ -1,8 +0,0 @@ -fun foo (x) { - return x; - 0 -} - -local n = read (); - -write (foo (n)) \ No newline at end of file diff --git a/spec/lama-spec.tex b/spec/lama-spec.tex index 2734d736c..2724f8e52 100644 --- a/spec/lama-spec.tex +++ b/spec/lama-spec.tex @@ -86,7 +86,7 @@ \newcommand{\descr}[2]{\smallskip{#1}\begin{itemize}[noitemsep,topsep=0pt]\item[]{#2}\end{itemize}} \lstdefinelanguage{lama}{ -keywords={skip,if,then,else,elif,fi,while,do,od,repeat,until,for,fun,local,public,return,import,length, +keywords={skip,if,then,else,elif,fi,while,do,od,repeat,until,for,fun,local,public,import,length, string,case,of,esac,when,boxed,unboxed,string,sexp,array,infix,infixl,infixr,at,before,after,true,false,eta,lazy,syntax}, sensitive=true, basicstyle=\small, diff --git a/src/Language.ml b/src/Language.ml index 136d01142..69e2dac2a 100644 --- a/src/Language.ml +++ b/src/Language.ml @@ -379,7 +379,6 @@ module Expr = (* loop with a pre-condition *) | While of t * t (* loop with a post-condition *) | Repeat of t * t (* pattern-matching *) | Case of t * (Pattern.t * t) list * Loc.t * atr - (* return statement *) | Return of t option (* ignore a value *) | Ignore of t (* unit value *) | Unit (* entering the scope *) | Scope of (string * decl) list * t @@ -540,7 +539,6 @@ module Expr = eval conf k (schedule_list [e; Control (fun (st, i, o, e::vs) -> (if Value.to_int e <> 0 then seq s expr else Skip), (st, i, o, vs))]) | Repeat (s, e) -> eval conf (seq (While (Binop ("==", e, Const 0), s)) k) s - | Return e -> (match e with None -> (st, i, o, []) | Some e -> eval (st, i, o, []) Skip e) | Case (e, bs, _, _)-> let rec branch ((st, i, o, v::vs) as conf) = function | [] -> failwith (Printf.sprintf "Pattern matching failed: no branch is selected while matching %s\n" (show(Value.t) (fun _ -> "") (fun _ -> "") v)) @@ -786,7 +784,6 @@ module Expr = Scope (defs, Repeat (s, e)) | _ -> Repeat (s, e) } - | %"return" e:basic[infix][Val]? => {isVoid atr} => {Return e} | %"case" l:$ e:parse[infix][Val] %"of" bs:!(Util.listBy)[ostap ("|")][ostap (!(Pattern.parse) -"->" scope[infix][atr])] %"esac"{Case (e, bs, l#coord, atr)} | l:$ %"lazy" e:basic[infix][Val] => {notRef atr} :: (not_a_reference l) => {env#add_import "Lazy"; ignore atr (Call (Var "makeLazy", [Lambda ([], e)]))} | l:$ %"eta" e:basic[infix][Val] => {notRef atr} :: (not_a_reference l) => {let name = env#get_tmp in ignore atr (Lambda ([name], Call (e, [Var name])))} @@ -1270,7 +1267,7 @@ let run_parser cmd = "while"; "do"; "od"; "repeat"; "until"; "for"; - "fun"; "local"; "public"; "external"; "return"; "import"; + "fun"; "local"; "public"; "external"; "import"; "length"; "string"; "case"; "of"; "esac"; "when"; diff --git a/src/SM.ml b/src/SM.ml index cad3316bf..bb99c7805 100644 --- a/src/SM.ml +++ b/src/SM.ml @@ -869,11 +869,6 @@ let compile cmd ((imports, infixes), p) = let env, flag, body = compile_expr false check env s in env, false, [LABEL loop] @ body @ (if flag then [LABEL check] else []) @ se @ (if fe then [LABEL lexp] else []) @ [CJMP ("z", loop)] - | Expr.Return (Some e) -> let lret, env = env#get_label in - add_code (compile_expr true lret env e) lret false [JMP env#end_label] (* [RET] *) - - | Expr.Return None -> env, false, [CONST 0; (*RET*) JMP env#end_label] - | Expr.Leave -> env, false, [] | Expr.Case (e, brs, loc, atr) -> diff --git a/src/version.ml b/src/version.ml index c926137b6..f72e56537 100644 --- a/src/version.ml +++ b/src/version.ml @@ -1 +1 @@ -let version = "Version 1.00, 2b9adec08, Mon Jan 25 01:22:56 2021 +0300" +let version = "Version 1.10, 7eb3e223b, Mon Jan 25 01:38:59 2021 +0300" diff --git a/stdlib/Collection.lama b/stdlib/Collection.lama index ed09875aa..49b11675c 100644 --- a/stdlib/Collection.lama +++ b/stdlib/Collection.lama @@ -305,30 +305,30 @@ public fun emptyMemo () { } public fun lookupMemo (mm@[p, m], v) { - case p of - #fun -> if p (v) then return v fi - | _ -> skip - esac; - - case v of - #unboxed -> v - | _ -> - case findMap (m, v) of - Some (w) -> w - | None -> - case v of - #string -> mm[1] := addMap (m, v, v); v - | _ -> - local vc = clone (v), i = case vc of #fun -> 1 | _ -> 0 esac; - for skip, i < v.length, i := i + 1 do - local vci = lookupMemo (mm, vc [i]); - vc [i] := vci - od; - mm [1] := addMap (m, vc, vc); - vc - esac - esac - esac + fun (x) { + case p of + #fun -> if p (v) then v else x () fi + | _ -> x () + esac} + (fun () {case v of + #unboxed -> v + | _ -> + case findMap (m, v) of + Some (w) -> w + | None -> + case v of + #string -> mm[1] := addMap (m, v, v); v + | _ -> + local vc = clone (v), i = case vc of #fun -> 1 | _ -> 0 esac; + for skip, i < v.length, i := i + 1 do + local vci = lookupMemo (mm, vc [i]); + vc [i] := vci + od; + mm [1] := addMap (m, vc, vc); + vc + esac + esac + esac}) } -- Maps of hashed pointers diff --git a/stdlib/regression/test03.lama b/stdlib/regression/test03.lama index dca90c2f6..ade9a34a7 100644 --- a/stdlib/regression/test03.lama +++ b/stdlib/regression/test03.lama @@ -1,5 +1,5 @@ fun f (x) { - return fun (y) {return x + y} + fun (y) {x + y} } write (compare (1, 2)); diff --git a/stdlib/regression/test20.lama b/stdlib/regression/test20.lama index 998a9d542..cc446f355 100644 --- a/stdlib/regression/test20.lama +++ b/stdlib/regression/test20.lama @@ -1,10 +1,10 @@ fun insert (tree, value) { case tree of - Empty -> return Node (value, Empty, Empty) + Empty -> Node (value, Empty, Empty) | Node (x, left, right) -> if x > value - then return Node (x, insert (left, value), right) - else return Node (x, left, insert (right, value)) + then Node (x, insert (left, value), right) + else Node (x, left, insert (right, value)) fi esac } diff --git a/stdlib/regression/test21.lama b/stdlib/regression/test21.lama index 9f3ecd3b1..471ee071f 100644 --- a/stdlib/regression/test21.lama +++ b/stdlib/regression/test21.lama @@ -2,18 +2,18 @@ fun collect_ints_acc (v, tail) { local i; case v of - a@#unboxed -> return Cons (a, tail) - | #string -> return tail + a@#unboxed -> Cons (a, tail) + | #string -> tail | _ -> for i := 0, i < v.length, i := i + 1 do tail := collect_ints_acc (v[i], tail) od; - return tail + tail esac } fun collect_ints (v) { - return collect_ints_acc (v, Nil) + collect_ints_acc (v, Nil) } case 1 of diff --git a/stdlib/regression/test23.lama b/stdlib/regression/test23.lama index dd6d8f6e5..6a1e02356 100644 --- a/stdlib/regression/test23.lama +++ b/stdlib/regression/test23.lama @@ -1,12 +1,12 @@ fun hd (l) { case l of - h : _ -> return h + h : _ -> h esac } fun tl (l) { case l of - _ : t -> return t + _ : t -> t esac }