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 { ++$_; } // Carl