From 1bc64babd1405bfa70567d576cdef3e45b508b95 Mon Sep 17 00:00:00 2001 From: Drahflow Date: Wed, 26 Mar 2014 00:48:47 +0100 Subject: Container types --- compiler/standardClient.ey | 12 ++++--- elymas/lib/list.ey | 69 +++++++++++++++++++++++++++++++++++++++ elymas/lib/map.ey | 14 ++++++++ elymas/loaded.ey | 2 ++ elymas/shared.ey | 2 ++ examples/working-loaded/list.test | 23 +++++++++++++ 6 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 elymas/lib/list.ey create mode 100644 elymas/lib/map.ey create mode 100644 examples/working-loaded/list.test diff --git a/compiler/standardClient.ey b/compiler/standardClient.ey index d807533..36f8472 100644 --- a/compiler/standardClient.ey +++ b/compiler/standardClient.ey @@ -644,7 +644,11 @@ # Run from right (stacktop) argument to left (stacklow) argument: # Take topmost type, check whether it can be found in other stacks (from top) # Eliminate all matching types via function or loop creation - { _ ==f sys .typed .inputs ==inputs + { _ ==f _ sys .typed .inputs ==inputs + sys .typed .outputs ==outputs + + outputs len 1 gt { "multi-output function in auto-loop" die } rep + [ ] ==concreteArgs [ ] ==viewPortOffset @@ -795,7 +799,7 @@ [ loops _ len dearray ==loopIndex ] =loops loopIndex 0 ge { loopIndex concreteArgs * ==loopedOver - loopedOver cloneForLoop ==results + outputs len { loopedOver cloneForLoop } { [ ] } ? * ==results loopedOver getLoopStart ==i { i loopedOver isLoopEnd not } { [ concreteArgs _ len dearray ] ==concreteArgsCopy @@ -805,7 +809,7 @@ } each concreteArgsCopy stageCalls argTypes loops unravel - i loopedOver transformLoopIndex results =[] + outputs len { i loopedOver transformLoopIndex results =[] } rep # results dump # TODO: think about a single function returning multiple values # should be solved by producing two arrays side by side @@ -813,7 +817,7 @@ i loopedOver doLoopStep =i } loop - results + outputs len { results } rep # push @$data, [\@results, ['array', '[]', [['range', 0, $#results]], [undef]]]; # FIXME the undef can be determined } { diff --git a/elymas/lib/list.ey b/elymas/lib/list.ey new file mode 100644 index 0000000..df5ba1c --- /dev/null +++ b/elymas/lib/list.ey @@ -0,0 +1,69 @@ +< + [ ] ==:NONE + + { -102 .len -021 ? } "#?" defmd + { .len } "#len" defmd + { 0 -01 .len range } "#dom" defmd + { [ 0 ] } _ "#in" deffd "#out" deffd + { ==m ==l + l .len { + l .start l .len 1 sub { 1 -01 * } rep + m .start 1 -102 =[] + l .len m .len add l .setLen + } { + m .start l .setStart m .len l .setLen + } ? * + m .end l .setEnd + + 0 m .setLen + NONE m .setStart + NONE m .setEnd + + l + } "#cat" defmd + { ==l =*f + l .start ==n + l .len { n 2 dearray =n f } rep + } "#each" defmd + { ==l l .len mod ==i + l .start i { 1 -01 * } rep + 0 -01 * + } "#*" defmd + { ==l ==i ==v + l .len not { "=[] into empty list" die } rep + l .start i l .len mod { 1 -01 * } rep + v 0 -102 =[] + } "#=[]" defmd + { ==l + list ==m + l .len { + [ 0 NONE ] _ m .setEnd + l .len 1 sub { [ 0 -102 ] } rep + m .setStart + l .len m .setLen + } { } ? * + m + } "#iclone" defmd + { 0 } "#istart" deffd + { .len eq } "#iend" defmd + { } "#itrans" deffd + { 1 add } "#istep" deffd + + { { ==l [ -01 NONE ] + l .len { + _ 1 l .end =[] + } { + _ l .setStart + } ? * + l .setEnd + l .len 1 add l .setLen + }_ [ 0 ] [ ] '' * } /append defmd + + { < + 0 ==len { =len } =*setLen + NONE ==start { =start } =*setStart + NONE ==end { =end } =*setEnd + > } +> -- /list deffd + +# vim: syn=elymas diff --git a/elymas/lib/map.ey b/elymas/lib/map.ey new file mode 100644 index 0000000..5c5b0f0 --- /dev/null +++ b/elymas/lib/map.ey @@ -0,0 +1,14 @@ +< + { .v -01 . } "#*" defmd + { [ 0 ] } "#in" deffd + { [ 0 ] } "#out" deffd + { .v keys } "#dom" defmd + { .v ==v =*f v keys { v -01 . f } each } "#each" defmd + { 0 } "#istart" deffd + { .v keys len eq } "#iend" defmd + { 1 add } "#istep" deffd + { .v keys * } "#itrans" defmd + { < < { defv }' > ==v "#=[]" =* > } _ "#iclone" deffd +> -- /map deffd + +# vim: syn=elymas diff --git a/elymas/loaded.ey b/elymas/loaded.ey index 125ab6d..c9c0eda 100644 --- a/elymas/loaded.ey +++ b/elymas/loaded.ey @@ -12,6 +12,8 @@ "lib/net/alg/server.ey" "lib/net/alg/http.ey" "lib/net/alg/uri.ey" + "lib/list.ey" + "lib/map.ey" ] { _ dump include }' each { diff --git a/elymas/shared.ey b/elymas/shared.ey index 8f70d1f..8c25b93 100644 --- a/elymas/shared.ey +++ b/elymas/shared.ey @@ -13,6 +13,8 @@ "lib/net/alg/server.ey" "lib/net/alg/http.ey" "lib/net/alg/uri.ey" + "lib/list.ey" + "lib/map.ey" ] { _ dump include }' each { diff --git a/examples/working-loaded/list.test b/examples/working-loaded/list.test new file mode 100644 index 0000000..7ac2e05 --- /dev/null +++ b/examples/working-loaded/list.test @@ -0,0 +1,23 @@ +list ==l +list ==m + +/foo l .append +/bar l .append +/quux l .append + +l { dump } each + +[ /a /b /c ] m .append + +m { dump } each +m len dump + +2 m * dump + +list _ [ 1 2 3 ] -01 .append +list _ [ 3 4 5 ] -01 .append + add ==a + +a dump +a len dump +a |dump each -- cgit v1.2.3