LINUX.ORG.RU

История изменений

Исправление Lilly, (текущая версия) :

Тут есть два момента:

1)В Perl 6 области видимости лексические и местами они столь лексические, что это просто непривычно. (кроме случаев, где используется динамическая видимость, тогда нет). Дело в том, что объявление my $i находится внутри фигурных скобок, которые являются телом test. Не внутри какого-то другого, нового блока видимости. Поэтому они доступны в этом блоке, в котором они объявлены, скобки здесь не играют роли. Если задуматься об этом, то это в других языках происходит странность, потому что круглые скобки создают отдельное пространство видимости, которое распространяется на блок, но это вносит некое inconsistency, верно? Perl 6 это очень целостный язык, в нём «специальные случаи, когда правило нарушается» это очень редкие события.

2)loop это довольно редкая конструкция в «реальном» Perl 6, которая нужна, когда ты прям 100% хочешь цикл в стиле С. Это бывает редко. Чаще всего ты хочешь for @source -> .... Если ты хочешь бесконечный цикл, то вместо while True ты пишешь loop {...}. Но если ты хочешь просто итерировать от 1 до 10, делай так:

sub test() { # <- внешний блок открыт здесь
    loop (my $i = 0; #`( нет новых фигурных скобок, всё, что в скобках, это всё ещё внешний блок )
          $i < 10; $i++)
        { #`( вокруг фигурные скобки - это внутренняя область видимости ) }
    for ^10 { say "$_ " }
    say "\n";
    for ^10 -> $i { say "$i " }
}

test();

^10 это сокращение для 0..^10, то есть «от 0 до 10, исключая». 0^..^10 будет от 0 до 10 исключая 0 и 10. Если начало 0, что очень частый случай, то можно сократить.

Исходная версия Lilly, :

Тут есть два момента:

1)В Perl 6 области видимости лексические и местами они столь лексические, что это просто непривычно. (кроме случаев, где используется динамическая видимость, тогда нет). Дело в том, что объявление my $i находится внутри фигурных скобок, которые являются телом test. Не внутри какого-то другого, нового блока видимости. Поэтому они доступны в этом блоке, в котором они объявлены, скобки здесь не играют роли. Если задуматься об этом, то это в других языках происходит странность, потому что круглые скобки создают отдельное пространство видимости, которое распространяется на блок, но это вносит некое inconsistency, верно? Perl 6 это очень целостный язык, в нём «специальные случаи, когда правило нарушается» это очень редкие события.

2)loop это довольно редкая конструкция в «реальном» Perl 6, которая нужна, когда ты прям 100% хочешь цикл в стиле С. Это бывает редко. Чаще всего ты хочешь for @source -> .... Если ты хочешь бесконечный цикл, то вместо while True ты пишешь loop {...}. Но если ты хочешь просто итерировать от 1 до 10, делай так:

sub test() {
    for ^10 { say "$_ " }
    say "\n";
    for ^10 -> $i { say "$i " }
}

test();

^10 это сокращение для 0..^10, то есть «от 0 до 10, исключая». 0^..^10 будет от 0 до 10 исключая 0 и 10. Если начало 0, что очень частый случай, то можно сократить.