<div dir="ltr">Интересно как они тогда сделали `1 <= $x <= 11` в Perl6? По идее для такого оператора нужно хитрое поведение: оператор в булевом контексте возвращает true или false, но результат для дальнейших вычислений значение $x. Или просто False всегда False в любых операторах сравнения?</div><div class="gmail_extra"><br><div class="gmail_quote">2015-11-28 23:52 GMT+03:00 Victor Efimov <span dir="ltr"><<a href="mailto:victor@vsespb.ru" target="_blank">victor@vsespb.ru</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><a href="http://www.nntp.perl.org/group/perl.perl6.language/2000/08/msg1104.html" rel="noreferrer" target="_blank">http://www.nntp.perl.org/group/perl.perl6.language/2000/08/msg1104.html</a><br>
<br>
It would be nice to be able to say<br>
<br>
     @a = @b || @c<br>
<br>
instead of having to resort to<br>
<span class=""><br>
     @a = @b ? @b : @c<br>
<br>
</span>The reason that it is not currently possible is that C<@b> (or the list<br>
expression in its place) has to be evaluated in scalar context to determine<br>
whether to evaluate C<@c>, and that propagating context to C<@b> would<br>
require reevaluating it, which might have undesirable side effects (instead<br>
of C<@b>, it might be C<decrement_balance()>).<br>
<br>
<br>
29 ноября 2015 г., 3:27 пользователь Eugen Konkov <<a href="mailto:kes-kes@yandex.ru">kes-kes@yandex.ru</a>> написал:<br>
<div class="HOEnZb"><div class="h5">> Всем привет.<br>
><br>
> Недавно работая с || наткнулся на то, что оператор возвращает не то, что предпологалось. Покопавшись в документации - нашел, что он работает именно так, а не так как ожидается:<br>
><br>
>         @a = @b || @c;          # this is wrong<br>
>         @a = scalar(@b) || @c;  # really meant this<br>
>         @a = @b ? @b : @c;              # this works fine, though<br>
><br>
> И мне кажется, что было бы намного лучше, если бы этот || работал наподобие:<br>
> sub OR {<br>
>    my( $left, $right ) = @_;<br>
><br>
>    if( wantarray ) {<br>
>        @result = $left->();                      # list<br>
>        return @result if scalar @result;<br>
><br>
>        return $right->();<br>
>    }<br>
>    else {<br>
>        $result = $left->();                      # scalar<br>
>        return $result if $result;<br>
><br>
>        return $right->();<br>
>    }<br>
> }<br>
><br>
><br>
> @l =  foo() OR bar(); # foo is called in list context<br>
> $s =  foo() OR bar(); # foo is called in scalar context<br>
><br>
> т.е. если || вызыван в списковом контексте, то левый операнд вычислять в  списковом и возвращать список,<br>
> если || вызван в скалярном - соответственно левый операнд вычислять тоже в скалярном и возвращать скаляр.<br>
><br>
> Что скажете: "жить" будет легче или нет?<br>
><br>
> --<br>
>  Eugen                          mailto:<a href="mailto:kes-kes@yandex.ru">kes-kes@yandex.ru</a><br>
><br>
> --<br>
> Moscow.pm mailing list<br>
> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Best regards, Ruslan.</div>
</div>