On Tue, Nov 19, 2002 at 07:45:25AM +1100, Damian Conway wrote:
: >What <mumble> might be is an interesting, er, topic.
:
: I would argue it ought to be just $_, which is, after all,
: the One True Topic. And conveniently lexically predeclared in all scopes.
:
: I would also argue that it ought not be called anything else.
: Surely don't want two specially named variables for the topic?
I actually had an entire ramble on that subject that I deleted from
my previous message before I wrote what I wrote. But the gist of
it was similar, in that $_ is of indeterminate meaning in a signature
anyway, so why not force it to mean what we want it to mean? The
long and the short of it was that
my sub foo ($_ := $arg = $_)
is how you might set $arg to be both the "topic" and the "given".
In the common case, that comes down to
my sub foo ($_ = $_)
to just propagate the outer $_ inward. But it still has the problem that
it looks like a declaration of $_ followed by a use of $_ that *isn't* that
declaration. So I was thinking it'd be better to use something different to
represent the outer topic, like:
my sub foo ($_ = $^)
my sub foo ($_ = $+)
my sub foo ($_ = $|)
my sub foo ($_ = $=)
my sub foo ($_ = $:)
my sub foo ($_ = $?)
my sub foo ($_ = $$)
my sub foo ($_ = $@)
or some such. That's what I meant by <mumble>. I kinda like $= at the
moment, presuming it's coming available from formats. Or maybe $?.
Possibly we have something more evil than that, such as the notion that
$? is a double sigil that pulls a name out of the dynamic context's
lexical scope. Then we could write $?_ for the outer $_, $?foo for the
outer $foo, @+_ for the outer @_, $?! for the outer $!, etc. That would
make it
my sub foo ($arg is topic = $?_)
I suppose it could be argued that defaulting the outer topic should also
set the inner topic by default, so you could write
my sub foo ($arg = $?_) {
when 1 { ... }
...
}
I'm trying to remember why it was that we didn't always make the first
argument of any sub the topic by default. I think it had to do with
the assumption that a bare block should not work with a copy of $_ from
the outside. But if the signature for a bare block is ($_ = $?_), and
if the = there is really a binding operator, then the inner $_ is just
an alias for the outer one, and it doesn't really matter in that case.
I'm not sure whether we should allow $?_ in a sub body, however.
for @sortparms {
&closure := { $?_
j ?? $^a <=> $^b
:: $^b <=> $^a
};
sort &closure, @list;
}
In this case, $?_ would be synonymous with $OUTER::_, since the block is
called in the same lexical context. But that wouldn't necessarily always
be the case. We can assume the outer dynamic scope also has a $_ in its
lexical scope, but assuming there's a $?foo out there is more problematic.
But maybe that's one way to explicitly export symbols:
module Foo;
&?foo := &my_foo;
That assumes we can tell the the outer scope is being compiled
currently. It would have the same restrictions as mucking around
with caller.MY, basically.
But don't worry, I still think normal export should be via properties
on the declaration of sub my_foo.
Larry