On Tue, 2005-03-29 at 11:38, Juerd wrote: > Luke Palmer skribis 2005-03-29 6:14 (-0700): > > method iterate () { > > for (@.objs) { > > .process($_); # oops > > } > > } [...] > $_ is the topic, and I think that if we have two topics, Perl gets as > convoluted as Japanese for someone who doesn't understand the language.
I've put a lot of thought into this one since topics were first broached. It's been nagging at me, and I think I see a solution. Use "given" as a statement (not a block control operator): given :invocant; This binds $_ to the current invocant. given 1; given maintains a stack (which, itself is lexically scoped, so you don't get to reach into a caller's givens), so here we request the 1th (zero-indexed, of course) context. If we call given's stack @_given, then the above statement is just: $_ := @_given[1]; Any implicit binding of $_ other than through the use of "given" inserts the new value into the stack, so you can do: given 1; given 0; given 1; Without changing the given stack (important for maintainable code). This is distinct from: given 1 { ... } In which we bind $_ to the number 1. This also works with labels: OUT: for @a { IN: for @b { given OUT; say "Outer scope {$_}"; given IN; say "Inner scope {$_}"; } } by determining the @_given entry that was active in the given scope (ok, so @_given actually contains more information than just the value itself). It would be potentially interesting to introduce a "give" keyword for this purpose: map {map {give 1} 0..1000} @foo; which simply returns the value of {given 1;$_} -- Aaron Sherman <[EMAIL PROTECTED]> Senior Systems Engineer and Toolsmith "It's the sound of a satellite saying, 'get me down!'" -Shriekback