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.) -- Solomon Foster: colo...@gmail.com HarmonyWare, Inc: http://www.harmonyware.com