Все ли конструкции цитирования Perl 6 имеют приоритет термина?

< > имеет приоритет термина. Вот пример из документации:

say <a b c>[1];

Я полагал, что один и тот же приоритет будет применяться ко всем операторам цитирования. Это работает:

my $string = '5+8i';
my $number = <<$string>>;
say $number;

Это интерполирует $string и создает алломорфы (в данном случае ComplexStr):

(5+8i)

Но если я попытаюсь проиндексировать его, как пример из документации, он не скомпилируется:

my $string = '5+8i';
my $number = <<$string>>[0];
say $number;

Я не совсем уверен, что Perl 6 думает, что здесь происходит. Возможно, он думает, что это гипероператор:

===SORRY!=== Error while compiling ...
Cannot use variable $number in declaration to initialize itself
at /Users/brian/Desktop/scratch.pl:6
------>     say $⏏number;
    expecting any of:
        statement end
        statement modifier
        statement modifier loop
    term

Я могу пропустить переменную:

my $string = '5+8i';
say <<$string>>[0];

Но это другая ошибка, которая не может найти закрывающие кавычки:

===SORRY!=== Error while compiling ...
Unable to parse expression in shell-quote words; couldn't find final '>>'
at /Users/brian/Desktop/scratch.pl:8
------> <BOL>⏏<EOL>
    expecting any of:
        statement end
        statement modifier
        statement modifier loop

person brian d foy    schedule 02.07.2017    source источник
comment
другая точка данных: <<"$string">>[0] работает как положено   -  person Christoph    schedule 02.07.2017
comment
Конечно. " — это еще один способ предотвратить попадание парсера в тупик >>..   -  person Elizabeth Mattijsen    schedule 03.07.2017


Ответы (2)


Я думаю, что это гарантирует электронное письмо rakudobug. Я думаю, что синтаксический анализатор запутается, пытаясь интерпретировать его как hyper (также известный как >>.method). Следующий обходной путь, кажется, подтверждает это:

my $string = '5+8i';
my $number = <<$string >>[0];  # note space before >>
say $number;

Чтобы удовлетворить ваше ОКР, вы могли бы также поставить пробел перед $string.

И да, пробелы не лишены смысла в Perl 6.

person Elizabeth Mattijsen    schedule 03.07.2017

У Джонатана есть ответ на вопрос RT #131695.

>>[] – это постфиксный оператор для индексации списка, поэтому он пытается использовать его как таковой. Это предполагаемое поведение. Достаточно справедливо, хотя я думаю, что синтаксический анализатор здесь слишком умен для обычных обезьян кода.

person brian d foy    schedule 03.07.2017
comment
Парсер не столько умен, сколько буквально мыслит. В какой-то момент правило для qq-интерполяции переменных превратилось во что-то очень похожее на интерполяцию любой сигиллированной переменной плюс любые постфиксные операторы, которые могут следовать, завершающиеся постциркумфиксом. Удобно, когда вы хотите сделать $foo.uc() или что-то еще. Но также и источник мысли. Это чаще всего кусает меня в строках HTML, таких как $stuff‹tag›...‹/tag›, где часть ‹tag› в конечном итоге анализируется как postcircumfix. - person Carl Mäsak; 04.07.2017