Можете ли вы зациклить блок Perl 6, который находится в переменной?

Я продолжаю хотеть сделать что-то вроде этого:

my $block := {
    state $n = 0;
    say $n++;
    last if $n > 3;
    };

loop $block;

Или даже:

$block.loop;

Я не ожидал, что это возможно, но было бы круто, если бы это было так.

Как я узнаю, откуда взялась та или иная рутина?

$ perl6
To exit type 'exit' or '^D'
> &loop.^name
===SORRY!=== Error while compiling:
Undeclared routine:
    loop used at line 1

person brian d foy    schedule 26.07.2017    source источник


Ответы (2)


Используя то, что уже есть в Perl 6, вы можете использовать Seq.from-loop в контексте приемника.
(Обратите внимание, что REPL не помещает последний оператор в строке в контекст приемника)

my $block := {
    state $n = 0;
    say $n++;
    last if $n > 3;
}

Seq.from-loop: $block;
Seq.from-loop: {say $++}, {$++ <= 3};
person Brad Gilbert    schedule 26.07.2017
comment
О, очень приятно. Спасибо. - person brian d foy; 26.07.2017
comment
FWIW, я чувствую, что это входит в серую зону конкретной реализации. Не уверен, что вы захотите поместить это в книгу. - person Elizabeth Mattijsen; 28.07.2017

Заставить $block.loop работать довольно просто, и он может жить в мире модулей:

use MONKEY;
augment class Block {
    method loop($self:) {
        Nil while $self()
    }
}
my $a = { print "a" };
$a.loop  # aaaaaaaaaaaaaaaaaaa (with apologies to Knorkator)

Заставить loop $block работать было бы гораздо сложнее, так как это потребовало бы изменений в обработке действий грамматики Perl 6.

person Elizabeth Mattijsen    schedule 26.07.2017