Я считаю, что одна из самых интересных функций как в Haskell, так и в Perl6 - это возможность откладывать расчетные значения до тех пор, пока они действительно не понадобятся.
Perl5, с другой стороны, любит делать все сразу, но, насколько я могу судить, содержит все необходимые примитивы для ленивых вычислений. Это:
- , принимая ссылку на
@_
в подпрограмме, создает ссылку на массив, которая связывается с идентификаторами в ее списке аргументов, даже если некоторые из этих идентификаторов еще не содержат значений.
- возвращает перегруженные / связанные объекты из таких подпрограмм, которые содержат
\@_
внутри, а затем разыменовывает его при необходимости. (и есть различные CPAN-модули, которые абстрагируют от деталей связи / перегрузки)
Я экспериментировал с различными методами ленивого программирования на Perl (в работах у меня есть модуль, в котором реализована немалая часть Прелюдии Haskell в Perl5 (такие вещи, как ко-рекурсия: уже работает)). Но у меня есть ощущение, что в коде скрываются некоторые тонкие ошибки, которые могут проявляться, когда функции используются в больших выражениях / программах.
Так что мне интересно, есть ли какие-нибудь хорошие примеры (CPAN / блоги / книги), которые кто-нибудь знает об этом, использующих Haskell / Perl6 как лень в Perl5? В частности, я хотел бы прочитать любой код значительного размера, который использует этот тип лени.
Мне также было бы интересно узнать, сталкивался ли кто-нибудь с какими-либо хитростями или неразрешимыми проблемами, связанными с реализацией отложенной оценки в Perl 5.