The obvious extension to given <value> is given <list>, as:

given $foo -> $bar is rw,    # I think this is more readable
      $moo -> $baz is rw
{
  ...
}

or

given ($foo, $moo) -> ($bar is rw, $baz)
{
  ...
}

What would the default-variable scheme do in this context? 

(Please, no-one suggest nesting 5 or 6 of these.)

=Austin


--- Allison Randal <[EMAIL PROTECTED]> wrote:
> Of course, this idea may have already been considered and rejected,
> in
> which case I'm just curious to learn the reasons.
> 
> What would be the cost (performance, design or dwim) of making all
> the
> defaulting constructs pay attention to the current topicalizer in
> preference to $_?
> 
> C<when> is beautifully dwim, testing against the topicalized value
> (the
> given) when there is one and $_ when there isn't. It seems like it
> might
> be useful if C<print>, C<chomp>, C<s///>, etc. behaved the same way.
> 
>       given $foo -> $bar {
>               when /something/  { # matches against $bar
>                       chomp; # also on $bar
>                       s/this/that/; # also on $bar
>                       print; # prints $bar
>               }
>       }
> 
> I like the idea of being able to say "defaulting constructs always
> obey
> the lexical scope of topicalizers".
> 
> For the most part, the change would have no impact on current code.
> Examples that use $_ would still behave the same, as $_ is the
> topicalized value anyway:
> 
>       for @foo {
>               s/this/that/; # substitute on $_ 
>               ...
>       }
> 
> Examples that use an aliased named variable would also work as-is,
> they
> would merely have the option of simplifying:
> 
>       for @foo -> $bar {
>               # $bar =~ s/this/that/;  # still works
>               # print $bar;
> 
>               s/this/that/;  # would do the same thing
>               print;
>               ...
>       }
> 
> There are problems with embedded topicalizers. Someone might
> intentionally use the fact that the $_ of the outer topicalizer is
> not
> clobbered by the aliased named variable of the inner topicalizer
> ($nonsense), and use a defaulting construct on $_ within the embedded
> scope. 
> 
>       for @foo {
>               s/this/that/; # on $_
>               for @stuff -> $nonsense {
>                       s/that/another/;        # currently on $_, 
>                                                               # on $nonsense with 
>change
>                       ...
>               }
>       }
> 
> Since it can be done, I'm sure the Perl 5 counterpart of this exists
> in
> some code somewhere. And even if $_ is officially "just another
> lexical"
> it still seems uncomfortable to have to code:
>       $_ =~ s/that/another/;
> 
> This may be a tolerable discomfort. I'm not sure. Using a second
> aliased
> named variable would also work, and has the advantage of making it
> more
> obvious (to the human eye) exactly which variable was matched
> against,
> especially within numerous levels of embedded topicalizers.
> 
>       for @foo -> $bar is rw {
>               for @stuff -> $nonsense {
>                       $bar =~ s/that/another/; 
>                       ...
>               }
>       }
> 
> If you wanted to set up a context in which a particular value was the
> default, instead of assigning the value to $_, you could wrap the
> code
> in a C<given>. 
> 
>       # Actually, this should already work, because $_ is
>       # aliased to the value of $foo.
>       given $foo { 
>               chomp; # on $_
>               s/this/that/; 
>               print;
>       }
> 
>       # This would have the same effect.
>       given $foo -> $bar is rw { 
>               chomp; # on $bar 
>               s/this/that/; 
>               print;
>       }
> 
> Is it an abuse of C<given> to use its abilities as a topicalizer
> outside
> the context of a switch statement? Well, possibly, but an interesting
> one. :)
> 
> Simply pondering,
> 
> Allison


__________________________________________________
Do You Yahoo!?
Yahoo! Sports - Coverage of the 2002 Olympic Games
http://sports.yahoo.com

Reply via email to