Author: pmichaud
Date: Sun Nov  9 20:58:24 2008
New Revision: 32478

Modified:
   trunk/languages/perl6/src/builtins/any-str.pir
   trunk/languages/perl6/src/classes/List.pir
   trunk/languages/perl6/src/classes/Mapping.pir
   trunk/languages/perl6/src/classes/Pair.pir

Log:
[rakudo]: Implementation of .fmt (RT #60382, masak++)


Modified: trunk/languages/perl6/src/builtins/any-str.pir
==============================================================================
--- trunk/languages/perl6/src/builtins/any-str.pir      (original)
+++ trunk/languages/perl6/src/builtins/any-str.pir      Sun Nov  9 20:58:24 2008
@@ -191,6 +191,23 @@
     .return ($P0)
 .end
 
+=item fmt
+
+ our Str multi Any::fmt ( Str $format )
+
+Returns the invocant formatted by an implicit call to C<sprintf>.
+
+=cut
+
+.sub 'fmt' :method :multi(_)
+    .param string format
+    .local pmc retv
+
+    retv = 'sprintf'(format, self)
+
+    .return(retv)
+.end
+
 =item index()
 
 =cut

Modified: trunk/languages/perl6/src/classes/List.pir
==============================================================================
--- trunk/languages/perl6/src/classes/List.pir  (original)
+++ trunk/languages/perl6/src/classes/List.pir  Sun Nov  9 20:58:24 2008
@@ -287,6 +287,44 @@
     .return values.'first'(test)
 .end
 
+=item fmt
+
+ our Str multi List::fmt ( Str $format, $separator = ' ' )
+
+Returns the invocant list formatted by an implicit call to C<sprintf> on each
+of the elements, then joined with spaces or an explicitly given separator.
+
+=cut
+
+.sub 'fmt' :method :multi('ResizablePMCArray')
+    .param pmc format
+    .param string sep          :optional
+    .param int has_sep         :opt_flag
+
+    .local pmc res
+    .local pmc iter
+    .local pmc retv
+    .local pmc elem
+    .local pmc elemres
+
+    if has_sep goto have_sep
+    sep = ' '
+  have_sep:
+    res = new 'List'
+    iter = self.'iterator'()
+  elem_loop:
+    unless iter goto done
+
+  invoke:
+    elem = shift iter
+    elemres = 'sprintf'(format, elem)
+    push res, elemres
+    goto elem_loop
+
+  done:
+    retv = 'join'(sep, res)
+    .return(retv)
+.end
 
 =item grep(...)
 

Modified: trunk/languages/perl6/src/classes/Mapping.pir
==============================================================================
--- trunk/languages/perl6/src/classes/Mapping.pir       (original)
+++ trunk/languages/perl6/src/classes/Mapping.pir       Sun Nov  9 20:58:24 2008
@@ -165,6 +165,50 @@
 .end
 
 
+=item fmt
+
+ our Str multi Mapping::fmt ( Str $format, $separator = "\n" )
+
+Returns the invocant mapping formatted by an implicit call to C<.fmt> on
+every pair, joined by newlines or an explicitly given separator.
+
+=cut
+
+.sub 'fmt' :method :multi('Hash')
+    .param pmc format
+    .param string sep          :optional
+    .param int has_sep         :opt_flag
+
+    .local pmc pairs
+    .local pmc res
+    .local pmc iter
+    .local pmc retv
+    .local pmc elem
+    .local pmc key
+    .local pmc value
+    .local pmc elemres
+
+    if has_sep goto have_sep
+    sep = "\n"
+  have_sep:
+    pairs = self.'pairs'()
+    res = new 'List'
+    iter = pairs.'iterator'()
+  elem_loop:
+    unless iter goto done
+
+  invoke:
+    elem = shift iter
+    elemres = elem.'fmt'(format)
+    push res, elemres
+    goto elem_loop
+
+  done:
+    retv = 'join'(sep, res)
+    .return(retv)
+.end
+
+
 .sub 'keys' :method :multi('Hash')
     .local pmc iter
     .local pmc rv

Modified: trunk/languages/perl6/src/classes/Pair.pir
==============================================================================
--- trunk/languages/perl6/src/classes/Pair.pir  (original)
+++ trunk/languages/perl6/src/classes/Pair.pir  Sun Nov  9 20:58:24 2008
@@ -87,6 +87,29 @@
 .end
 
 
+=item fmt
+
+ our Str multi Pair::fmt ( Str $format )
+
+Returns the invocant pair formatted by an implicit call to C<sprintf> on
+the key and value.
+
+=cut
+
+.sub 'fmt' :method
+    .param pmc format
+
+    .local pmc retv
+    .local pmc key
+    .local pmc value
+
+    key = self.'key'()
+    value = self.'value'()
+    retv = 'sprintf'(format, key, value)
+
+    .return(retv)
+.end
+
 =item perl
 
 Returns a Perl code representation of the pair.

Reply via email to