At 4:39 PM -0700 4/24/05, Larry Wall wrote:
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

Reply via email to