Это работает (как начало):
use List::Gen '*';
iterate{$_%2 ? 3*$_+1 : $_/2}->from(23)->until(sub{$_ == 1 ? (($delay = 1), 0) : $delay})->say();
Позвольте мне увидеть, если я могу сделать функцию из этого и сделать $delay
безопасным ...
Это должно работать, но не потому что функция передается until
вызывается дважды (за исключением первого значения):
use List::Gen '*';
sub after { use feature 'state'; $f = shift(); $f = '$_' . $f unless (ref($f)); sub { state $d; $r = $d; $d = eval $f; $r } }
iterate{ $_%2 ? 3*$_+1 : $_/2 }->from(23)->until(after('==1'))->say;
Это работает для вызова двойной функции:
use List::Gen '*';
sub after { use feature 'state'; $f = shift(); $f = '$_' . $f unless (ref($f)); sub { state($d1,$d2); $r = $d2; $d2 = $d1; $d1 = eval $f; $r } }
iterate{ $_%2 ? 3*$_+1 : $_/2 }->from(23)->until(after('==1'))->say;
По-прежнему пытается понять, почему функция until
вызывается дважды после первого вызова.
Работает только для until
, а не while
.
Приведенный выше код работает только со строковыми аргументами; это один работает со ссылками функции:
#!/usr/bin/perl
use strict;
use List::Gen '*';
sub after {
use feature 'state';
my $f = shift();
my $c = ref($f) eq 'CODE'
? '&$f()'
: '$_' . $f;
sub {
state($d1,$d2);
my $r = $d2;
$d2 = $d1;
$d1 = eval($c);
$f;
$r
}
}
iterate{$_%2 ? 3*$_+1 : $_/2}->from(23)->until(after('==1'))->say;
iterate{$_%2 ? 3*$_+1 : $_/2}->from(23)->until(after(sub{$_ == 1}))->say;
Хм ... Если бы хорошую функцию, но обнаружил, что после того, как первый вызов 'while' или' until', последующие вызовы 'while' или' until' выполняются дважды для одного и того же значения: 23, 70, 70, 35, 35, 106, 106, ..., 4, 4, 2, 2, 1! Смотрите: 'iterate {$ _% 2? 3 * $ _ + 1: $ _/2} -> из (23) -> while (sub {print "_ = $ _ \ n"; $ _! = 1}) -> say; ' – kjpires
Я понял [обходной путь] (http://stackoverflow.com/a/30664416/133939), который чувствует себя чище, что связано с добавлением 'undef' после того, как встречается первый« 1 », и тестирование для' defined'-ness – Zaid
Если это wasn ' t для двойного вызова (который все еще вызывает у меня недоумение), я мог бы заставить эту функцию задержки возвращать дополнительные последовательности N, которые могли бы быть полезны для несконтерминирующих последовательностей. – kjpires