为什么 Perl 6 的 Map 在一种情况下给我一个值而在另一种情况下给我一个列表?

Why does Perl 6's Map give me a value in one case and a list in another?

我正在玩 Map,我得到了一个我不明白的结果。

首先,我构建 Map。没什么大不了的:

> my $m = Map.new: '1' => :1st, '2' => :2nd;
Map.new(("1" => :st(1),"2" => :nd(2)))

我通过文字键访问单个元素并返回一对:

> $m<1>.^name
Pair
> $m<<1>>.^name
Pair

没关系。

如果我尝试使用变量中的键,我会返回 List

> my $n = 1
1
> $m<<$n>>.^name
List

该列表具有正确的值,但为什么在那种情况下我得到的是 List 而不是 $m<<1>> 的情况?

而且,一旦我有了列表,我似乎无法将另一个下标链接到它:

> $m<<$n>>.[0]
===SORRY!=== Error while compiling:
Unable to parse quote-words subscript; couldn't find right double-angle quote
at line 2

当您像这样访问关联值时,编译器会告诉它它只需要 return 一个值。

$m<  1  >
$m<< 1 >>

在 Perl 6 中,奇异值在许多情况下的行为就像一个值的列表。

42.elems == 1 # True
42.[0] =:= 42 # True

在以下情况下,编译器无法立即判断它只会产生一个值:

my $n = 1;
$m<< $n >>;

因为它可以产生 2 个值:

my $o = '1 2';
$m<< $o >>;

如果希望字符串是单个键,则必须使用引号。

$m<< "$o" >>

或者使用更合适的{}

$m{ $n }

$m<1> 只是两个特征的组合。

  1. 引用词:( qw<>qqww<<>> )

    <   a  b  c   > eqv ("a", "b", "c")
    <  "a  b" c   > eqv (「"a」, 「b"」, "c") # three strings
    
    <<  a  b  c  >> eqv ("a", "b", "c")
    << "a  b" c  >> eqv ("a  b", "c")    # two strings
    
  2. 关联索引:

    %h<   a  b  c  > eqv %h{ <   a  b  c  > }
    %h<< "a  b" c >> eqv %h{ << "a  b" c >> }
    

我现在也得到了不同的值。

$m<   1  >.WHAT =:= Pair
$m<<  1 >>.WHAT =:= Pair
$m<< $n >>.WHAT =:= Pair # different

$m<< $o >>.WHAT =:= List

$m<<$n>>.[0] 不起作用的原因是编译器认为您使用的是超级后缀 >>.[0]

有几种方法可以解决这个问题。

  1. 实际使用超级后缀

    $m<<$n>>>>.[0]
    $m<<$n>>».[0]
    
  2. 使用非空格。 (永远不能在运算符内部,所以将它们分开)

    $m<<$n>>\.[0]
    $m<<$n>>\     .[0]
    

我认为这是一个错误,因为在 quotewords 语句中匹配超级后缀没有多大意义。
(不影响$m<<1>>.elems