[Moscow.pm] Волшебный баг с AnyEvent::postpone

Konstantin S. Uvarin khedin на gmail.com
Пт Сен 13 08:48:31 PDT 2013


Приветствую.

>не получили прототип
>не имеете права

  Это-то я понимаю. Меня, скорее, удивило, ЧТО происходит в отсутствие
прототипа. Ну и то, что AnyEvent это проглотил и не сказал не слова (на
самом деле он ловит unhandled exception в event loop, когда пытается
выполнить "результат code"->(). Но пользователь об этом не факт что
узнает.).

  Вообще я был бы рад, если бы из нижеприведённого корректным кодом был
бы только вариант с прототипом.

perl -wle 'foo{ 3 => print "xx" }; sub foo { print shift }'
perl -wle 'sub foo; foo{ 3 => print "xx" }; sub foo { print shift }'
perl -wle 'sub foo(&); foo{ 3 => print "xx" }; sub foo (&) { print
shift }'

On Fri, 2013-09-13 at 18:45 +0400, Mons Anderson wrote:
> Т.к. вы не делали use AnyEvent (require in compile time), то вы не получили прототип функции AE::postpone
> соответственно писать
> 
> AE::cv { … }
> или 
> AE::postpone { … }
> 
> не имеете права.
> 
> On 13.09.2013, at 18:16, "Konstantin S. Uvarin" <khedin at gmail.com> wrote:
> 
> > Приветствую.
> > 
> > ##############
> > #!/usr/bin/perl -w
> > 
> > use strict;
> > require AnyEvent; # not use
> > 
> > my $cv = AnyEvent->condvar;
> > print 1;
> > AnyEvent::postpone{ print 3; $cv->send; };
> > print 2;
> > $cv->recv;
> > print 4;
> > ##############
> > 
> > perl script.pl выводит 1324. 
> > 
> > Т.е. код, который postpone ("выполнить на следующем витке event loop"),
> > на самом деле выполняется прямо сейчас.
> > 
> > Если require заменить на use (или просто perl -MAnyEvent script.pl), всё
> > нормально: 1234.
> > 
> > Или если написать AnyEvent::postpone( sub { ... } ); (так, видимо, и
> > сделаем, т.к. не хотим грузить AE в BEGIN-е).
> > 
> > Такое ощущение, что foo{ code; } трактуется как "вызвать foo( результат
> > code )". Почему так? 
> > 
> > Я ожидал чего-то такого:
> > 
> > perl -we  'sub foo{ print shift }; foo{ print 2 };'
> > Odd number of elements in anonymous hash at -e line 1.
> > 2HASH(0x91ff7ec)
> > 
> > А, да, perl 5.14.2 (linux) и 5.14.4 (freebsd)
> > 
> > -- 
> > Konstantin S. Uvarin
> > 
> > 
> > -- 
> > Moscow.pm mailing list
> > moscow-pm at pm.org | http://moscow.pm.org
> 




Подробная информация о списке рассылки Moscow-pm