Perl 6

Интервальные условия

В математике очень распространены конструкции с двумя знаками неравенства, например: 0 < x < 10. Ни Perl, ни C++ не позволяет напрямую перенести эту идиому в программный код. Хотя записать нужное условие, использую логические оператор and (&&) крайне просто, переменную приходится упоминать дважды: (0 < $x && $x < 10).

В Perl 6 возможно объединять условия, исключая лишние ссылки на одну и ту же переменную:

my $x = 5;
print "yes" if 0 < $x < 10;

Такое же условие разрешено и в обычной форме оператора if (само условие можно и не заключать в круглые скобки):

if (0 < $x < 10){
   print "yes";
}
else{
   print "no";
}

Более того, работоспособным оказывается и код с большим числом нанизанных условий:

my $x = 5;
my $y = 15;
print "yes" if 0 < $x < 10 < $y;

Чтобы убедиться в том, что такой условный оператор работает так, как от него ожидается, можно изменить переменную $y, присвоив ей, например, значение 6. В этом случае все условие окажется ложным. Сомнения возникли из-за того, что выражение $x < 10 < $y можно рассматривать и как сравнение двух целых переменных: булевого значения ($x < 10), преобразованного к целому, и переменной $y. Если ($x < 10) выполняется, то все условие при таком предположении эквивалентно проверке 1 < $y, которая удачна при любом $y, превышающем единицу. Однако, поскольку все условие 0 < $x < 10 < $y; истинно, когда $y = 15, и ложно при $y = 5, можно сделать вывод: нанизанные условные операторы работают так, как они и должны работать.

Следуя этой идеологии, можно предположить, что допустим и такой код:

print (($x < 10 < $y) ?? "yes" :: "no");

И это действительно работает. О тернарном операторе выбора — отдельная заметка.

 
29 октября 2003