--- Allison Randal <[EMAIL PROTECTED]> wrote:
> On Wed, Feb 27, 2002 at 10:11:13AM -0800, Austin Hastings wrote:
> >
> > > C<when> is a conditional like C<if>, not a topicalizer.
> >
> > Right, it's a topicalizee, the victim of topicalization.
> > And so it uses $_ or $x or $! or whatever the current topic is.
>
> i.e. a "defaulting construct" or "topic sensitive keyword". I like
the
> latter, in this case, because it expresses what C<when> defaults to.
okay, "tsk" it is.
>
> > But inside, you have to KNOW what the topic is again,
> > you can't just use the default variable(s), so that
> > differentiation of
> >
> > for @logged_exceptions -> $e {
> > when .survivable { if $e.isa('Exception::PEBKAC') { ... } }
> > }
> >
> > versus
> >
> > CATCH {
> > when .survivable { if $!.isa('Exception::PEBKAC') { ... } }
> > }
> >
> > becomes necessary.
> >
> > What I'm trying to suggest is that C<when>, because it already is
> > doing some special things (huge list of conditionals to try,
> > implied 'next'), is an orthogonal code element. It really IS
> > going sideways, and unless you are coding sideways (using
> > C<given> or C<CATCH>) the when-block represents a context-switch
> > at the developer level.
> >
> > To that end C<when> should, when (urg!) used in a loop or other
> > straight-ahead construct to check the current topic, force the
> > current topic to become the default.
>
> I absolutely agree with the problem you're trying to solve. The "when
> ..survivable" vs. "if $e.isa..." distinction bothers me as well. But
> I'm greedy. I don't want to treat the symptom by adding to the list
> of ways that C<when> is weird.
Which is why I think it's reasonable for the same rule that applies to
"for" in perl5 to apply here:
for (@ary) { print; }
Nobody has the least bit of trouble understanding that WITHIN the for
loop, the "default value" just changed from whatever it was outside.
Likewise:
when .survivable { print; }
to me is obvious. (Or at least could become obvious by the time I
finished reading the v.6 camel book... :-)
> I want a systematic solution for the whole
> language. To me that means taking a step back from the familiar, but
> limiting, concept of "$_ is default". Exactly how that will work out,
> defaulting to topic everywhere, flagging the variable with an
> "assumed"
> property, or something else entirely, I'm not sure. But however it's
> done, I want it to be consistent in the bigger picture.
Consistent how? I assume you're willing to keep the "is default" idea.
(Visions of millions of perl hacks with torches and pitchforks here...)
So what's inconsistent? I think that making the "is default" value
inside the C<when> match the the topic *is* consistent. It scans.
My notion is that having that change take place and
_losing_access_to_data_ is wrong. So:
2- Give me one last chance to save away or alias $_.
(Uniformly amivalenegative reaction, but it did put the onus and the
performance issues on the developer.)
-or-
1- Don't use $_ as the default, use $$topic.
("why would we want to do that?!?!")
Either way C<when> can do the right thing and perform a "source context
switch" while not restricting my access to the data I may have had
current outside the block.
Of course, #1 means there needs to be a way of figuring out what the
current topic is, which tends to either add function calls or circle us
back around to $_ (or some other line noise var) once again.
How about this: whenever $_ is superseded by a topic, the old value
gets shifted/pushed into @__ (two underscores). If you want it, it's
there. If you don't, it gets quietly unshifted/popped in a few moments.
Or this: $_ is always the current topic, but $__ is a ref to the last
$_ in case you want to get it.
Or this: $_ is always the current topic, but $. is the current 'point',
and usually $. := $_, except when topicalized.
Frankly, my big concern is that there are (at least in perl5) a lot of
places where variables are prescribed. map, sort, grep come immediately
to mind. As long as I get one chance to rescue those data bits, I don't
care if nested C<when>s rewrite each other's topics or push them on a
stack or store them in the caller() or whatever.
=Austin
__________________________________________________
Do You Yahoo!?
Yahoo! Greetings - Send FREE e-cards for every occasion!
http://greetings.yahoo.com