On Sat, Jan 28, 2006 at 06:30:06PM +0100, dakkar wrote: : Today I was reading S06 from : http://dev.perl.org/perl6/doc/design/syn/S06.html, and I have some : perplexities on what's written there. : : 1) it's written: : : $pair = :when<now>; : doit $pair,1,2,3; # always a positional arg : doit *$pair,1,2,3; # always a named arg : : but also: : : To pass pairs out of hash without their being interpreted as named : parameters, use : : doit %hash<a>:p,1,2,3; : doit %hash{'b'}:p,1,2,3; : : instead. : : I interpret the last sentence as meaning that: : : $hash<a>=:a<2>; doit %hash<a>; : : would be equivalent to: : : doit :a<2> : : which contradicts what is written earlier... I'd assume I'd have to : write: : : doit *(%hash<a>); : : for the pair to be used as a named argument. What am I missing?
You're reading "pass pairs" as meaning to return a particular value that happens to be a pair. That's not the purpose of :p, since that's what happens anyway by default. You use :p to return both the key and the value as a pair object from the hash. If you say: %hash<b>=:a<2>; doit %hash<b>; it's equivalent to doit (:a<2>) whereas if you say %hash<b>=:a<2>; doit %hash<b>:p; it is equivalent to doit (:b(:a<2>)) In neither case is the argument taken as a named argument. I have rewritten the paragraph as: Ordinary hash notation will just pass the value of the hash entry as a positional argument regardless of whether it is a pair or not. To pass both key and value out of hash as a positional pair, use C<:p>. doit %hash<a>:p,1,2,3; doit %hash{'b'}:p,1,2,3; instead. (The C<:p> stands for "pairs", not "positional"--the C<:p> adverb may be placed on any hash reference to make it mean "pairs" instead of "values".) to try to make it clearer. : 2) Consider: : : doit %*hash; # 1 arg, the global hash : doit *%hash; # n args, the key-value pairs in the hash : : I think I'll use a lot of C-t while writing Perl6 code... The * as shorthand for GLOBAL:: is allowed only where it wouldn't be confused with unary *. That is, only in declarative contexts or as a twigil. : 3) What does the second line in: : : push @array, :a<1>; : say *pop(@array); : : mean? I'd parse it as 'say (*pop)(@array)', that is, call the global : 'pop' subroutine. But the text around this example seems to imply that : it is to be parsed as 'say *(pop(@array))', i.e. execute 'pop' and splat : the result. What gives? The above rule. If we meant the global pop we'd say: say &*pop(@array); or say GLOBAL::pop(@array); Gotto go to lunch--more in a bit. (Please use new subjects if you want to discuss any of these subpoints further...) Larry