On Wed, Nov 20, 2002 at 04:20:07PM -0600, Me wrote:
: > $_ = 1; mumble { $_ = 2 }; print;
: >
: > will print 1 or 2?
:
: Least surprise, visually, is obviously 2.
:
: This would be true if bare blocks (even
: those passed as args) just pick up from
: the surrounding lexical context. And if
: that were true, mumble presumably could
: not do anything about this (without some
: as yet undefined language support).
Yes, that's the problem. A bare block would have to notice at run
time that it was called with unexpected arguments and unbind its
binding to the outer $_. That's probably not gonna fly.
: What does this mean:
:
: $_ = 1; mumble -> { $_ = 2 }; print;
:
: perhaps the '->' could imply that $_ /is/
: going to be private to the block somehow?
As it stands now, explicitly telling it there are no arguments would
have exactly the opposite effect, and bind $_ to the outer $_.
: Could mumble somehow be a continuation that
: alternated between generating values to be
: plugged in to the block and executing it?
Well, sure, doesn't need to be a continuation for that. Doesn't
even need to be a coroutine unless you plan to get the values one
by one.
: > sub mumble (&block) {
: > block()
: > }
: >
: > Oddly, if we make the first argument the
: > topic by default, the second block actually
: > gets &block as its topic. That's...strange.
:
: This would go away with the above scenario.
True, but I think C<mumble> has to be able to wrap its own idea of $_
around the block at compile time somehow. Perhaps we need to distinguish
the type of a "thunk" from a "sub" in the signature of C<mumble>.
sub mumble1 (Sub &block) { block($curtopic) }
sub mumble2 (Block &block) { block() }
Then
mumble1 { ... }
would compile to
mumble1 -> $_ { ... }
while
mumble2 { ... }
would compile to
mumble2 -> { ... }
forcing $_ to bind outward like a closure.
Possibly those are declared
sub mumble1 (&block(Scalar)) { block($curtopic) }
sub mumble2 (&block) { block() }
since code blocks are essentially typed by their signatures.
Larry