Am Montag, den 02.11.2009, 14:33 -0500 schrieb Solomon Foster:
> On Mon, Nov 2, 2009 at 2:03 PM, Solomon Foster <colo...@gmail.com> wrote:
> > On Mon, Nov 2, 2009 at 10:21 AM, Carl Mäsak <cma...@gmail.com> wrote:
> >> Solomon (>), Moritz (>>):
> >>>> 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?
> >>
> >> For one thing, then you couldn't do this:
> >>
> >> my @a = 1, 2, 3;
> >> for @a {
> >>  ++$_;
> >> }
> >
> > I meant, make it readonly if the container being iterated over is
> > readonly.  We're working hard to make the language prefer immutable
> > things, it seems very odd to short circuit that in a key area like
> > this...
> >
> > (Though personally, I would prefer it if map was readonly by default
> > on all containers.)
> 
> Or Larry could just find an elegant way to do it.  Yay!

FYI: Larry already found that correcting the Spec was the most elegant
solution ;)

> Author: lwall
> Date: 2009-11-02 17:31:00 +0100 (Mon, 02 Nov 2009)
> New Revision: 28973
>
> Modified:
>   docs/Perl6/Spec/S06-routines.pod
> Log:
> [S06] correct $_ placeholder binding from "rw" to "ref", moritz++


Reply via email to