Создание нового ключевого слова Perl с помощью Devel:: Declare

У меня возникли проблемы с созданием ключевых слов Devel::Declare. В этом случае не так много примеров и учебников.

Мой любимый проект - создать новое ключевое слово с именем doing, которое имеет синтаксис, похожий на Ruby do, например:

my @arr = qw/foo bar baz/;
@arr doing $x {
    print "x is $x";
};

Моя идея - превратить его в инструкцию for my $x (@arr) { ... } с помощью Devel::Declare разборок. Я не уверен, что это возможно.

Большинство примеров, которые я нашел (из Devel:: Declare тестовый каталог) предназначены для создания ключевого слова method.

Я был бы признателен за некоторые указания о том, как начать работу, или ключевые функции, которые можно использовать, чтобы иметь возможность обрабатывать, или существующий код для базы.

Ответ 1

  • Devel:: Declare не позволит вам вернуть то, что уже было проанализировано. Если вы превратите doing в ключевое слово, тогда @arr doing ... все еще необходимо преобразовать в нечто, начинающееся с @arr, которое кажется довольно большим препятствием.
  • Из-за того, как Devel:: Declare acutally делает свою магию, он ограничен определенным образом - он позволяет вам объявлять "ключевые слова", которые выглядят как имена подсайтов, в местах, где Perl будет искать имя под. Это не позволит вам помещать произвольные операторы, где вам нравится. На самом деле он работает с наименьшим искажением в ситуациях, когда у вас есть keyword somestuff { ... }, который может превратиться в простой вызов keyword( некоторого другого материала и, возможно, преобразованного sub { ... }). Вы можете понять, почему это так хорошо подходит для таких вещей, как method или Test::Class::Sugar. Моя точка зрения заключается в том, что сразу же после того, как имя массива не является местом, где Perl-парсер ищет имя суб; это место, где парсер ищет оператора, и поэтому @arr doing ... даст вам ошибку bareword found where operator expected, прежде чем Devel:: Declare получит шанс вмешаться.

Возможно, обоим из них можно было бы преодолеть, изменив ситуацию так, чтобы ваше ключевое слово появилось первым в строке, но теперь у вас есть keyword somestuff { ... }, где имя массива является некотором, и вы твердо входите в шаблон, который большинство других модулей вырезали - только если вы создаете цикл for, вы, вероятно, оставите блок как подлинный блок вместо того, чтобы его анализировать как подвое определение.