On Mon, Nov 02, 2009 at 10:16:39AM -0500, Solomon Foster wrote:
> On Mon, Nov 2, 2009 at 9:53 AM, Moritz Lenz <mor...@faui2k3.org> wrote:
> > Hi,
> >
> > the current spec doesn't allow immutable containers to call .map with a
> > block that implicitly uses $_ as an implicit parameter.
> >
> > Here's why:
> >
> > S06 says
> >
> >> The C<$_> variable functions as a placeholder in a block without any
> >> other placeholders or signature.  Any bare block without placeholders
> >> really has a parameter like this:
> >>
> >>     -> $_ is rw = OUTER::<$_> { .mumble }
> >
> > So $_ is marked as rw, which is checked at binding time.
> >
> > Now lists are immutable, meaning that you can't bind a list item rw, so
> > even if the block doesn't try to modify $_, calling the { .say } block
> > fails.
> >
> > (Note that 'for' has the same problem)
> >
> > How should that be resolved? Should a temporary variable be created that
> >  can be changed, without any effect? or should it fail() on detecting a
> > modification? Somehow this approach seems very backward to me...
> 
> Is there a reason $_ is readonly isn't a possible solution?

I have no idea how often $_ as an implicit parameter is actually used.
Note that if you want s/// to work, you really need a mutable $_.

If it were just for iteration, I'd not object to making it an ro-alias by
default, requiring an explict rw signature (for example with <-> $_ { ... })
otherwise.

Cheers,
Moritz

Reply via email to