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