Метки и «Команды управления потоком не разрешены на верхнем уровне» (возможное сообщение об ошибке LTA) - PullRequest
0 голосов
/ 15 февраля 2019

Этот код:

FOO:
"Hey".say;
for <1 2> { 
    say "1";
    last FOO
}

Печать

Hey
1
Control flow commands not allowed in toplevel

Последнее сообщение об ошибке удаляется, если "Эй". Скажите, снято;это, вероятно, означает, что на самом деле ошибка говорит о том, что не команды управления потоком не разрешены сразу за меткой.Но документация (которую необходимо улучшить приводит циклы в качестве "примера", а грамматика указывает, что она должна быть перед оператором. Таким образом,Вопрос в том, может ли он использоваться для операторов if или просто циклов?

1 Ответ

0 голосов
/ 15 февраля 2019

Ошибка будет другой, если у вас есть этот код в другой области видимости:

{
    FOO:
    "Hey".say;
    for <a b> {
        .say;
        last FOO
    }
}
# Hey
# a
# labeled last without loop construct

, который также является LTA, поскольку в нем не упоминается название метки.

Но вкороткий: Perl 6 в настоящее время не имеет goto.В настоящее время метки можно использовать только как способ указать, какую конструкцию цикла вы хотите next, redo или last из.Поместив оператор между меткой и конструкцией цикла, вы эффективно используете его в качестве goto, который все еще не реализован.

Но на самом деле билет о LTAness обеих ошибок, кажется вместо для меня.

Кроме того, использование фазера FIRST в качестве альтернативы, похоже, имеет ту же проблему:

FOO:
for <a b> { 
    FIRST "Hey".say;
    .say;
    last FOO;
}   
# Hey
# a
# labeled last without loop construct

Но работает без специальной метки:

FOO:
for <a b> { 
    FIRST "Hey".say;
    .say;
    last;
}   
# Hey
# a

Последний вопрос, безусловно, стоит вопроса ракуда: добавлено как https://github.com/rakudo/rakudo/issues/2699.

...