June 10th, 2014

Book

Дай дураку метапрограммирование - он и лоб расшибет

Как известно, в перле у функций нет параметров. Предлагается работать с массивом аргументов. Способов работы было придумано несколько. Например, извлекать аргументы по одному, укорачивая (!) массив:
sub foo
{
   my $bar = shift;
   my $baz = shift;
   print "arg 1 = $bar, arg 2 = $baz\n";
}
Это идиоматический код. По-крайней мере в начале 2000-х считался идиоматическим. Т.е. все процедуры всем предлагается писать таким образом.

В стандартной библиотеке функция shift, отрезающая от массива первый элемент.

Аргументом по умолчанию она принимает этот @_ и оптимизирована, так что шифты, по-крайней мере в этом конкретном случае, отрабатывают быстро.

В последние N лет идиома с шифтом почти полностью вытеснена другим кодом:
sub foo
{
   my ($bar, $baz) = @_;
   print "arg 1 = $bar, arg 2 = $baz\n";
}
А недавно, копаясь в кишках какой-то библиотеки, нашёл фантастический вариант:
use Function::Parameters;
 
fun foo($bar, $baz)
{
   print "arg 1 = $bar, arg 2 = $baz\n";
}
Оказалось, что в очередной версии Перла сделали синтаксис расширяемым, и можно писать плагины к парсеру.

А сегодня я обнаружил, что на CPAN есть 100500 разных (!) реализаций этих параметров. Пусть расцветают сто цветов, пусть соперничают сто школ, чо.
Book

Бинарные библиотеки для Perl под винду

Перепробовав разные комбинации, остановился на Strawberry Perl и PAR. Начну с конца

Установка на продакшен

- Ставим Strawberry Perl MSI в папку без пробелов
- Заливаем приложение
- Заливаем репоз (в котором лежат бинарные пекеджи зависимостей приложения, включая транзитивные)
- Запускаем install.pl (в котором лежит манифест непосредственных зависимостей):
use PAR { repository => '.', dependencies => 1, install => 1 };

use Function::Parameters;
use CHI;
use CHI::Driver::BerkeleyDB;
- Запускаем приложение и откидываемся на спинку кресла

Билд пекеджей из репоза

- Создаем build-repo.cmd, в котором описана последовательность сборки пакетов:
call build CHI
call build Function::Arguments
call build MooX::Types::MooseLike::Numeric
call build Hash::MoreUtils
call build Time::Duration
call build Digest::JHash
call build CHI::Driver::BerkeleyDB
call inject
Он не совпадает со списком install.pl из-за того, что часть пакетов на CPAN с багами, и зависимости не прописаны в метаданных.

Установка билд-тулзов

Использованные выше билд-тулзы для репоза ставятся install-dev.pl из того же самого или отдельного репоза:
use PAR { repository => '.', dependencies => 1, install => 1 };

use CPANPLUS::Dist::PAR;
use PAR::Repository;
А теперь самое интересное:

Бутстрап билд-тулзов

- Создаем папочку будущего репоза и в ней 2 однострочных батника:

build.bat: call cpan2dist --format CPANPLUS::Dist::PAR --install %*

inject.bat: call parrepo inject -r . --file "%UserProfile%\.cpanplus\5.20.0\dist\PAR\*.par"

parrepo предоставляется PAR::Repository, у которого в зависимостях YAML::Syck, который крешится на Strawberry Perl for Windows 64. Скачиваем ZIP-снапшот ветку из гитхаба и кладем в нашу папку прямо в виде архива.

Создаем dev-bootstrap.cmd:
call cpanp i CPANPLUS::Dist::PAR
call build CPANPLUS::Dist::PAR
call build --archive perl5-yaml-syck-fix-win64-crashes.zip
call build PAR::Repository
call parrepo create -r .
call inject
Забутстрапились :)