Создание нового ключевого слова Perl с Devel :: Declare - PullRequest
10 голосов
/ 27 февраля 2011

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

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

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

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

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

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

1 Ответ

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...