# New Ticket Created by Cory Spencer
# Please include the string: [perl #61550]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=61550 >
After having code such as:
(1..4).map: { .say }
fail because the map method wasn't accessible to the Range class, I've
moved both map and grep into any-list.pir and put it in the Any class.
map/grep should work on both Lists and Ranges now.
Index: src/builtins/any-list.pir
===================================================================
--- src/builtins/any-list.pir (revision 34129)
+++ src/builtins/any-list.pir (working copy)
@@ -24,7 +24,6 @@
'!EXPORT'('end', 'from'=>$P0)
.end
-
=item elems()
=cut
@@ -56,6 +55,38 @@
.return ($I0)
.end
+=item grep(...)
+
+=cut
+
+.sub 'grep' :method :multi(_, '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
+ .tailcall values.'grep'(test)
+.end
+
=item join
=cut
@@ -80,7 +111,60 @@
.return ($S0)
.end
+=item map()
+=cut
+
+.namespace []
+.sub 'map' :multi('Sub')
+ .param pmc expression
+ .param pmc values :slurpy
+ .tailcall values.'map'(expression)
+.end
+
+.namespace ['Any']
+.sub 'map' :method :multi(_, '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 'List'
+ 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:
+ .return(res)
+.end
+
=item min
=cut
Index: src/classes/List.pir
===================================================================
--- src/classes/List.pir (revision 34129)
+++ src/classes/List.pir (working copy)
@@ -16,7 +16,7 @@
p6meta.'register'('ResizablePMCArray', 'parent'=>listproto,
'protoobject'=>listproto)
$P0 = get_hll_namespace ['List']
- '!EXPORT'('first,grep,keys,kv,map,pairs,reduce,values', $P0)
+ '!EXPORT'('first,keys,kv,pairs,reduce,values', $P0)
.end
=head2 Methods
@@ -375,39 +375,6 @@
.return(retv)
.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
- .tailcall values.'grep'(test)
-.end
-
-
=item iterator()
Returns an iterator for the list.
@@ -469,63 +436,6 @@
.tailcall values.'kv'()
.end
-
-=item map()
-
-Map.
-
-=cut
-
-.sub 'map' :method :multi('ResizablePMCArray', '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 'List'
- 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:
- .return(res)
-.end
-
-
-.sub 'map' :multi('Sub')
- .param pmc expression
- .param pmc values :slurpy
- .tailcall values.'map'(expression)
-.end
-
-
=item pairs()
Return a list of Pair(index, value) elements for the invocant.