From: Allison Randal > Garrett Goebel wrote: > > > > Why does C<when>'s EXPR pay attention to the topicalizer > > regardless of associated variable? > > > > Why introduce the special case? .... > > Why? Because it's oh-so dwim. Think about it, if you've just typed a > > given $x { ... > or > given $x -> $y { ... > > you know for a fact that you're going to want every C<when> to > compare against the $_ or $y. Why force people to type: > > when $y =~ /a/ {...} > when $y =~ /b/ {...} > ... > > when you already know what they mean? And yes, it's the > common case. How many times do you think you'll have a > switch statement and want the case to compare against > some value external to the switch?
Not just some value external to the switch, but the value in $_. I now see the DWIM aspect. Thanks BTW. But how often will people have non- C<when> statements within a C<given> scope that'll need the special case handling so they can see a different $_ than C<when>? To adapt your example: $hi = 'hello'; $x = 'burt'; for $hi { given $x -> $y { when /burt/ { print "Go Away" }; default { print }; } } or without the special case: $hi = 'hello'; $x = 'burt'; for $hi -> $y { given { when /burt/ { print "Go Away" }; default { print }; } } The second is obviously more explict, but does but requires a few more keys be typed. I wonder if the C<given>/C<when> special case is really going to be used regularly enough to justify the loss of clarity, consistency, and the additional obfuscation potential. $_ = 'foo'; given 'bar' -> $z { if /foo/ { ... } # true, $_ = foo when 'bar' { # true, $_ = bar if /foo/ { ... }; # true, $_ = foo } $_ = 'baz'; # $_ = baz when 'bud' { # false, $_ = bar if /baz/ { ... }; # true, $_ = baz } } I guess the next question in the context of the following is: Larry Wall wrote in Apocalypse 4: > It should be possible to make user-extensible syntax look > just like built-in syntax. How would I create a user-extensible construct that works like given/when? I'm guessing the answer is: you don't.