Я считаю, что одна из самых интересных особенностей как Haskell, так и Perl6 - способность откладывать вычисления значений до тех пор, пока они не понадобятся.Примеры ленивых методов оценки в Perl 5?
Perl5 с другой стороны любит делать все сразу, но из того, что я могу сказать, содержит все необходимые примитивы для ленивой оценки. Это:
- принимая ссылку на
@_
в подпрограмме создает ссылку на массив, который является псевдонимом для идентификаторов в списке аргументов, даже если некоторые из этих идентификаторов не содержат значения еще. - возвращает перегруженные/связанные объекты из таких подпрограмм, которые содержат
\@_
внутри, а затем разыгрывают их по мере необходимости. (И существуют различные CPAN модули, абстрагироваться от галстука/детали перегрузки)
Я экспериментировал с различными методами ленивых программирования в Perl (у меня есть модуль в работах, реализующий справедливый бит Haskell Прелюдия в Perl5 (такие вещи, как совместная рекурсия: $_ = list 0, 1, zipWith {&sum} $_, tail $_ for my $fibs;
для определения последовательности Фибоначчи уже работают)). Но я чувствую, что в коде есть скрытые ошибки, которые могут проявляться, когда функции используются в больших выражениях/программах.
Так что мне интересно, есть ли какие-нибудь хорошие примеры (CPAN/блоги/книги), которые все знают о том, что Haskell/Perl6 используют как ленивость в Perl5? В частности, я хотел бы прочитать любой код значительного размера, который использует этот тип лень.
Я бы также интересно знать, если кто-то возникнут какие-либо подводные камни или неразрешимые проблемы, связанные с осуществлением ленивой оценки в Perl 5.
Я предполагаю, что вы читали Perl высшего порядка. В нем много материала об итераторах, бесконечных потоках и лени. – 2010-12-07 23:07:22