[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