Re: Operating on pairs, Was Re: Revised solution #2

2009-01-16 Thread Richard Hainsworth

Carl Mäsak wrote:

Andy ():
  

map?

perl6 -e 'my $x = :a5; say $x.map( {  .value / 10} ).fmt(%s)'



Yes, sure. That'll print a tenth of the value of $x. The '.fmt(%s)'
is a no-op in this case.

// Carl
  

Not entirely a no-op. Thus
$perl6
 my $x=:a5; say $x.map({.value/10}).fmt(the value is %s%%)
the value is 0.5%

But we have lost the .key part of the pair

 my $x=:a5; say $x.map({.value/10}).fmt(key %s val %s)
Null PMC access in get_string()

Still, even if we could do something like (which we cant with rakudo, 
not sure if this is possible in perl6 in principle)
say $pair.map({.key = .value*100/$count}).fmt(Candidate %s has %s 
percent of vote);


would it be more elegant than
printf(Candidate %s has %s percent of 
vote\n,$pair.key,$pair.value*100/$count);


I dont think so.



Operating on pairs, Was Re: Revised solution #2

2009-01-15 Thread Richard Hainsworth

Larry Wall wrote:

On Wed, Jan 14, 2009 at 09:55:38AM +0300, Richard Hainsworth wrote:
  
However, I came across one thing in solution #3 that I posted yesterday.  
$pair.fmt(%s %s) is nice, but it doesnt allow for any action on either  
value or key before printing (I wanted to print the value as a  
percentage), and this had to be done in a printf statement. In fact the  
printf statement was the longest and ugliest statement in the program.



Maybe I'm missing something, but you can always do:

$pair.key.foo.fmt(%s),
$pair.value.bar.fmt(%s)

Larry
  

This surely requires that foo and bar are defined as sub's.

Suppose I just need a single transformation of a value before outputting 
it? Eg., expressing .value as a percentage of $count?


Is there some way to include a one-off in the subroutine chain? 
Something like

$pair.value.{shift / 10}.fmt(%s);