[SPb-pm] [Moscow.pm] Работа оператора ||
Ruslan Zakirov
ruslan.zakirov at gmail.com
Sun Nov 29 05:30:59 PST 2015
Интересно как они тогда сделали `1 <= $x <= 11` в Perl6? По идее для такого
оператора нужно хитрое поведение: оператор в булевом контексте возвращает
true или false, но результат для дальнейших вычислений значение $x. Или
просто False всегда False в любых операторах сравнения?
2015-11-28 23:52 GMT+03:00 Victor Efimov <victor at vsespb.ru>:
> http://www.nntp.perl.org/group/perl.perl6.language/2000/08/msg1104.html
>
> It would be nice to be able to say
>
> @a = @b || @c
>
> instead of having to resort to
>
> @a = @b ? @b : @c
>
> The reason that it is not currently possible is that C<@b> (or the list
> expression in its place) has to be evaluated in scalar context to determine
> whether to evaluate C<@c>, and that propagating context to C<@b> would
> require reevaluating it, which might have undesirable side effects (instead
> of C<@b>, it might be C<decrement_balance()>).
>
>
> 29 ноября 2015 г., 3:27 пользователь Eugen Konkov <kes-kes at yandex.ru>
> написал:
> > Всем привет.
> >
> > Недавно работая с || наткнулся на то, что оператор возвращает не то, что
> предпологалось. Покопавшись в документации - нашел, что он работает именно
> так, а не так как ожидается:
> >
> > @a = @b || @c; # this is wrong
> > @a = scalar(@b) || @c; # really meant this
> > @a = @b ? @b : @c; # this works fine, though
> >
> > И мне кажется, что было бы намного лучше, если бы этот || работал
> наподобие:
> > sub OR {
> > my( $left, $right ) = @_;
> >
> > if( wantarray ) {
> > @result = $left->(); # list
> > return @result if scalar @result;
> >
> > return $right->();
> > }
> > else {
> > $result = $left->(); # scalar
> > return $result if $result;
> >
> > return $right->();
> > }
> > }
> >
> >
> > @l = foo() OR bar(); # foo is called in list context
> > $s = foo() OR bar(); # foo is called in scalar context
> >
> > т.е. если || вызыван в списковом контексте, то левый операнд вычислять
> в списковом и возвращать список,
> > если || вызван в скалярном - соответственно левый операнд вычислять тоже
> в скалярном и возвращать скаляр.
> >
> > Что скажете: "жить" будет легче или нет?
> >
> > --
> > Eugen mailto:kes-kes at yandex.ru
> >
> > --
> > Moscow.pm mailing list
> > moscow-pm at pm.org | http://moscow.pm.org
> --
> Moscow.pm mailing list
> moscow-pm at pm.org | http://moscow.pm.org
>
--
Best regards, Ruslan.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/spb-pm/attachments/20151129/0f05ae8d/attachment.html>
More information about the Spb-pm
mailing list