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