On Mon, Apr 25, 2005 at 02:13:26AM +0800, Autrijus Tang wrote: : A while ago I posted a conflict between a block containing a pair : constructor, vs. a hash constructor: : : map { $_ => $_ } @foo;
: And maybe it can be extended over adverbial blocks, too: : : @foo.map:{ $_ => $_ }; # closure
Why not just always use the ':' when you are giving a block. The block is essentially an adverb for a map|grep|sort anyway. Whereas, no ':' means its a hash-ref. (Presumably each of map|grep|sort will have a reasonable default adverb if no ':{}' is given.)
I really think for clarity it has to be disambiguated by either something syntactic on the front or something semantic at the top level.
I agree. See my previous paragraph for an example.
I still kinda like the rule that it's a hash if the top-level looks like some kind of list of pairs. It optimizes for the common case.
I agree.
Closures returning pairs are a rarity. Larry
This is beside the point but ...
Perhaps one of the new Perl 6 features makes this unnecessary, but I often found myself doing just that when I wanted an effective method to test multiple times if an element is in an array, like this:
my %foo = map:{ ( $_ => 1 ) } @bar; if( %foo{'abc'} ) ... if( %foo{'def'} ) ... if( %foo{'zrs'} ) ...
That closure is returning a pair for each array element.
-- Darren Duncan