aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2014-03-26 00:48:47 +0100
committerDrahflow <drahflow@gmx.de>2014-03-26 00:48:47 +0100
commit1bc64babd1405bfa70567d576cdef3e45b508b95 (patch)
treeb535d5bfb665b1422ef44e9bef087192b63b1b44
parent08b33426f756a79b7500b0bea5597924def2bf87 (diff)
Container types
-rw-r--r--compiler/standardClient.ey12
-rw-r--r--elymas/lib/list.ey69
-rw-r--r--elymas/lib/map.ey14
-rw-r--r--elymas/loaded.ey2
-rw-r--r--elymas/shared.ey2
-rw-r--r--examples/working-loaded/list.test23
6 files changed, 118 insertions, 4 deletions
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