Author: jonathan
Date: Wed Aug 20 16:43:27 2008
New Revision: 30413

Modified:
   branches/lazyrakudo/languages/perl6/src/builtins/any-list.pir
   branches/lazyrakudo/languages/perl6/src/classes/Junction.pir
   branches/lazyrakudo/languages/perl6/src/classes/List.pir
   branches/lazyrakudo/languages/perl6/src/classes/Mapping.pir

Log:
[rakudo] Get some more of the built-ins working with lazy lists, albeit not 
lazily yet (depends on gather/take to do that - can be done in the future).

Modified: branches/lazyrakudo/languages/perl6/src/builtins/any-list.pir
==============================================================================
--- branches/lazyrakudo/languages/perl6/src/builtins/any-list.pir       
(original)
+++ branches/lazyrakudo/languages/perl6/src/builtins/any-list.pir       Wed Aug 
20 16:43:27 2008
@@ -83,6 +83,8 @@
     unless $I0 goto have_by
     by = shift values
   have_by:
+    $P0 = get_hll_global 'list'
+    values = $P0(values)
     .return values.'min'(by)
 .end
 
@@ -125,6 +127,8 @@
     unless $I0 goto have_by
     by = shift values
   have_by:
+    $P0 = get_hll_global 'list'
+    values = $P0(values)
     .return values.'max'(by)
 .end
 

Modified: branches/lazyrakudo/languages/perl6/src/classes/Junction.pir
==============================================================================
--- branches/lazyrakudo/languages/perl6/src/classes/Junction.pir        
(original)
+++ branches/lazyrakudo/languages/perl6/src/classes/Junction.pir        Wed Aug 
20 16:43:27 2008
@@ -1451,7 +1451,7 @@
     type = j.'!type'()
     new_junc.'!type'(type)
 
-    new_values = new 'List'
+    new_values = new 'ResizablePMCArray'
     iterator = iter ResultHash
 nv_loop:
     unless iterator goto nv_loop_end
@@ -1563,7 +1563,7 @@
     type = j.'!type'()
     new_junc.'!type'(type)
 
-    new_values = new 'List'
+    new_values = new 'ResizablePMCArray'
     iterator = iter ResultHash
 nv_loop:
     unless iterator goto nv_loop_end

Modified: branches/lazyrakudo/languages/perl6/src/classes/List.pir
==============================================================================
--- branches/lazyrakudo/languages/perl6/src/classes/List.pir    (original)
+++ branches/lazyrakudo/languages/perl6/src/classes/List.pir    Wed Aug 20 
16:43:27 2008
@@ -38,7 +38,7 @@
     listproto = p6meta.'register'($P0, 'parent'=>'Any')
 
     $P0 = get_hll_namespace ['List']
-    '!EXPORT'('keys values', $P0)
+    '!EXPORT'('first grep keys map values', $P0)
     #'!EXPORT'('first grep keys kv map pairs reduce values', $P0)
 .end
 
@@ -543,6 +543,144 @@
 .end
 
 
+=item map()
+
+Map.
+
+=cut
+
+.sub 'map' :method :multi('List', 'Sub')
+    .param pmc expression
+    .local pmc res, elem, block, mapres, iter, args
+    .local int i, arity
+
+    arity = expression.'arity'()
+    if arity > 0 goto body
+    arity = 1
+  body:
+    res = new 'ResizablePMCArray'
+    iter = self.'iterator'()
+  map_loop:
+    unless iter goto done
+
+    # Creates arguments for closure
+    args = new 'ResizablePMCArray'
+
+    i = 0
+  args_loop:
+    if i == arity goto invoke
+    unless iter goto elem_undef
+    elem = shift iter
+    goto push_elem
+  elem_undef:
+    elem = new 'Failure'
+  push_elem:
+    push args, elem
+    inc i
+    goto args_loop
+
+  invoke:
+    (mapres :slurpy) = expression(args :flat)
+    unless mapres goto map_loop
+    mapres.'!flatten'()
+    $I0 = elements res
+    splice res, mapres, $I0, 0
+    goto map_loop
+
+  done:
+    $P0 = get_hll_global 'list'
+    res = $P0(res)
+    .return(res)
+.end
+
+
+.sub 'map' :multi('Sub')
+    .param pmc expression
+    .param pmc values          :slurpy
+    $P0 = get_hll_global 'list'
+    values = $P0(values)
+    .return values.'map'(expression)
+.end
+
+
+=item first(...)
+
+=cut
+
+.sub 'first' :method :multi('List', 'Sub')
+    .param pmc test
+    .local pmc retv
+    .local pmc iter
+    .local pmc block_res
+    .local pmc block_arg
+
+    iter = self.'iterator'()
+  loop:
+    unless iter goto nomatch
+    block_arg = shift iter
+    block_res = test(block_arg)
+    if block_res goto matched
+    goto loop
+
+  matched:
+    retv = block_arg
+    goto done
+
+  nomatch:
+    retv = new 'Failure'
+    goto done
+
+  done:
+    .return(retv)
+.end
+
+
+.sub 'first' :multi('Sub')
+    .param pmc test
+    .param pmc values :slurpy
+    $P0 = get_hll_global 'list'
+    values = $P0(values)
+    .return values.'first'(test)
+.end
+
+
+=item grep(...)
+
+=cut
+
+.sub 'grep' :method :multi('List', 'Sub')
+    .param pmc test
+    .local pmc retv
+    .local pmc iter
+    .local pmc block_res
+    .local pmc block_arg
+
+    retv = new 'ResizablePMCArray'
+    iter = self.'iterator'()
+  loop:
+    unless iter goto done
+    block_arg = shift iter
+    block_res = test(block_arg)
+
+    unless block_res goto loop
+    retv.'push'(block_arg)
+    goto loop
+
+  done:
+    $P0 = get_hll_global 'list'
+    retv = $P0(retv)
+    .return(retv)
+.end
+
+.sub 'grep' :multi('Sub')
+    .param pmc test
+    .param pmc values          :slurpy
+    $P0 = get_hll_global 'list'
+    values = $P0(values)
+    .return values.'grep'(test)
+.end
+
+
 =back
 
 =head2 Methods added to ResizablePMCArray
@@ -690,123 +828,6 @@
 .namespace [ "TODO" ]
 
 
-=item perl()
-
-Returns a Perl representation of a List.
-
-=cut
-
-.sub 'perl' :method
-    .local string result
-    result = '['
-
-    .local pmc iter
-    iter = self.'iterator'()
-    unless iter goto iter_done
-  iter_loop:
-    $P1 = shift iter
-    $S1 = $P1.'perl'()
-    result .= $S1
-    unless iter goto iter_done
-    result .= ', '
-    goto iter_loop
-  iter_done:
-    result .= ']'
-    .return (result)
-.end
-
-
-.namespace [ 'ResizablePMCArray' ]
-
-=back
-
-
-=item elems()
-
-Return the number of elements in the list.
-
-=cut
-
-.sub 'elems' :method :multi('ResizablePMCArray') :vtable('get_number')
-    self.'!flatten'()
-    $I0 = elements self
-    .return ($I0)
-.end
-
-
-=item first(...)
-
-=cut
-
-.sub 'first' :method :multi('ResizablePMCArray', 'Sub')
-    .param pmc test
-    .local pmc retv
-    .local pmc iter
-    .local pmc block_res
-    .local pmc block_arg
-
-    iter = self.'iterator'()
-  loop:
-    unless iter goto nomatch
-    block_arg = shift iter
-    block_res = test(block_arg)
-    if block_res goto matched
-    goto loop
-
-  matched:
-    retv = block_arg
-    goto done
-
-  nomatch:
-    retv = new 'Failure'
-    goto done
-
-  done:
-    .return(retv)
-.end
-
-
-.sub 'first' :multi('Sub')
-    .param pmc test
-    .param pmc values :slurpy
-
-    .return values.'first'(test)
-.end
-
-
-=item grep(...)
-
-=cut
-
-.sub 'grep' :method :multi('ResizablePMCArray', 'Sub')
-    .param pmc test
-    .local pmc retv
-    .local pmc iter
-    .local pmc block_res
-    .local pmc block_arg
-
-    retv = new 'List'
-    iter = self.'iterator'()
-  loop:
-    unless iter goto done
-    block_arg = shift iter
-    block_res = test(block_arg)
-
-    unless block_res goto loop
-    retv.'push'(block_arg)
-    goto loop
-
-  done:
-    .return(retv)
-.end
-
-.sub 'grep' :multi('Sub')
-    .param pmc test
-    .param pmc values          :slurpy
-    .return values.'grep'(test)
-.end
-
-
 =item kv()
 
 Return items in invocant as 2-element (index, value) lists.
@@ -817,7 +838,7 @@
     .local pmc result, iter
     .local int i
 
-    result = new 'List'
+    result = new 'ResizablePMCArray'
     iter = self.'iterator'()
     i = 0
   iter_loop:
@@ -828,68 +849,60 @@
     inc i
     goto iter_loop
   iter_end:
+    $P0 = get_hll_global 'list'
+    result = $P0(result)
     .return (result)
 .end
 
 .sub 'kv' :multi()
     .param pmc values          :slurpy
+    $P0 = get_hll_global 'list'
+    values = $P0(values)
     .return values.'kv'()
 .end
 
 
-=item map()
+=item perl()
 
-Map.
+Returns a Perl representation of a List.
 
 =cut
 
-.sub 'map' :method :multi('ResizablePMCArray', 'Sub')
-    .param pmc expression
-    .local pmc res, elem, block, mapres, iter, args
-    .local int i, arity
+.sub 'perl' :method
+    .local string result
+    result = '['
 
-    arity = expression.'arity'()
-    if arity > 0 goto body
-    arity = 1
-  body:
-    res = new 'List'
+    .local pmc iter
     iter = self.'iterator'()
-  map_loop:
-    unless iter goto done
+    unless iter goto iter_done
+  iter_loop:
+    $P1 = shift iter
+    $S1 = $P1.'perl'()
+    result .= $S1
+    unless iter goto iter_done
+    result .= ', '
+    goto iter_loop
+  iter_done:
+    result .= ']'
+    .return (result)
+.end
 
-    # Creates arguments for closure
-    args = new 'ResizablePMCArray'
 
-    i = 0
-  args_loop:
-    if i == arity goto invoke
-    unless iter goto elem_undef
-    elem = shift iter
-    goto push_elem
-  elem_undef:
-    elem = new 'Failure'
-  push_elem:
-    push args, elem
-    inc i
-    goto args_loop
+.namespace [ 'ResizablePMCArray' ]
 
-  invoke:
-    (mapres :slurpy) = expression(args :flat)
-    unless mapres goto map_loop
-    mapres.'!flatten'()
-    $I0 = elements res
-    splice res, mapres, $I0, 0
-    goto map_loop
+=back
 
-  done:
-    .return(res)
-.end
 
+=item elems()
 
-.sub 'map' :multi('Sub')
-    .param pmc expression
-    .param pmc values          :slurpy
-    .return values.'map'(expression)
+Return the number of elements in the list.
+
+=cut
+
+.sub 'elems' :method :multi('ResizablePMCArray') :vtable('get_number')
+    self.'!flatten'()
+    $I0 = elements self
+    .return ($I0)
 .end
 
 

Modified: branches/lazyrakudo/languages/perl6/src/classes/Mapping.pir
==============================================================================
--- branches/lazyrakudo/languages/perl6/src/classes/Mapping.pir (original)
+++ branches/lazyrakudo/languages/perl6/src/classes/Mapping.pir Wed Aug 20 
16:43:27 2008
@@ -99,7 +99,7 @@
     .local pmc iter
     .local pmc rv
     iter = new 'Iterator', self
-    rv   = new 'List'
+    rv   = new 'ResizablePMCArray'
   loop:
     unless iter goto end
     $S1 = shift iter
@@ -108,6 +108,8 @@
     push rv, $S1
     goto loop
   end:
+    $P0 = get_hll_global 'list'
+    rv = $P0(rv)
     .return (rv)
 .end
 
@@ -117,13 +119,15 @@
     .local pmc iter
     .local pmc rv
     iter = new 'Iterator', self
-    rv   = new 'List'
+    rv   = new 'ResizablePMCArray'
   loop:
     unless iter goto end
     $S1 = shift iter
     push rv, $S1
     goto loop
   end:
+    $P0 = get_hll_global 'list'
+    rv = $P0(rv)
     .return (rv)
 .end
 
@@ -132,7 +136,7 @@
     .local pmc iter
     .local pmc rv
     iter = new 'Iterator', self
-    rv   = new 'List'
+    rv   = new 'ResizablePMCArray'
   loop:
     unless iter goto end
     $S1 = shift iter
@@ -140,6 +144,8 @@
     push rv, $S1
     goto loop
   end:
+    $P0 = get_hll_global 'list'
+    rv = $P0(rv)
     .return (rv)
 .end
 

Reply via email to