Как Perl 6 оценивает правдивость?

Когда вы читаете о Perl 6, я вижу, что функция транслируется, где вам больше не нужно делать:

return "0 but true";

... но может вместо этого сделать:

return 0 but True;

Если это так, как работает истина в Perl 6? В Perl 5 это было довольно просто: 0, "", а undef - false, все остальное верно.

Каковы правила в Perl 6, когда речь идет о булевом контексте?

Ответ 1

Итак, чтобы совместить то, что я думаю, чтобы быть лучшим из всех ответов:

Когда вы вычисляете переменную в булевом контексте, ее метод .true() вызывается. По умолчанию метод .true(), используемый объектом, проверяет значение объекта на Perl 5-style < 0, ", undef > , но когда вы говорите" но True "или" но False", этот метод переопределяется с тем, который не смотрит на значение, просто возвращает константу.

Можно было бы написать метод true(), который, скажем, вернул true, когда значение было четным и false, когда оно было нечетным.

Ответ 2

Perl 6 теперь оценивает правду, задавая объекту вопрос, а не глядя на его значение. Значение не является объектом. Это то, что мне понравилось в других языках объектов и будет рад иметь в Perl: я могу решить, как объект реагирует и может его изменить. Как сказал ysth, вы можете сделать это в Perl 5 с перегрузкой, но я всегда чувствую, что мне нужно мыть руки после этого.:)

Если вы ничего не измените, Perl 6 ведет себя так же, как Perl 5, поэтому вы получаете наименьшее количество сюрпризов.

Ответ 3

См. Сводка 12: Роли.

Правила те же, но "но" копирует 0 и применяет роль к копии, которая заставляет ее быть истинным в булевом контексте.

Вы можете сделать то же самое с перегрузкой в ​​Perl 5.

Ответ 4

Тест на правду просто вызывает метод .true для объекта, поэтому операция "mix in" $stuff but True просто (между прочим) переопределяет этот метод.

Это указано в S02, обычно типы перечислений (из которых Bool - один) описаны в S12.

Ответ 5

Согласно O'Reilly Perl 6 и Parrot Essentials, false равен 0, undef, пустая строка, а значения помечены как ложные. true - это все остальное.

Кроме того, Perl 6 имеет как примитивный логический тип, так и наличие True и False ролей, что любое значение может смешиваться (так что вы можете иметь значение "0, но True" или "1, но False", например, или ложный список, содержащий элементы, или истинный список, который пуст).

См. http://www.mail-archive.com/[email protected]/msg09930.html

Ответ 6

Одно ложное значение, которое игнорируется почти везде, равно "0". Недавно я сделал это болезненное открытие, что "0" false в PERL 5. Gee. Непустая строка, которая неверна. Я действительно надеялся, что это изменится в PERL6, но я думаю, что нет.

> if ( "0" ) { say "True" } else { say "False" }
False

|| = idiom сбила некоторые строки, которых я действительно не ожидал:

$ perl -e '$x = "0"; $x ||= ""; print ">>$x<<\n";'
>><<