Привет всем, кто продолжает следить за Perl 6. Сегодня пятница, а это значит, что, нет, не в эфире «Поле чудес», а новый пост про Perl 6.
Кстати, хочу обрадовать всех пользователей: в эфире нашего месячника шестого перла выходят уже вторые обновления Parrot и Rakudo. Нынешний Rakudo уже на 69,98% — готовый Perl 6.
Но и это еще не все, на днях также вышел первый релиз-кандидат обновленной текущей версии, 5.10.1
Но, не буду вас больше задерживать, потому что тема сегодня очень интересная — «Объединения».
Как часто вы пишете код, подобный этому:
if $drink eq 'wine' || $drink eq 'beer' {
say "Don't get drunk on it!";
}
Используя объединения, вы можете писать так:
if $drink eq 'wine' | 'beer' {
say "Don't get drunk on it!";
}
- "wine" | "beer" — это объединения
Что такое объединения?
- объединения можно использовать везде, где возможно использование одного значения
- вы можете сохранить их в скаляре
- Но, в то же время, они могут сохраняться и вести себя, как несколько значений
- различные типы объединений имеют различные типы тношений
Объединения — это яркий пример того, как Perl 6 стремится быть похожим на человеческий язык. Они явно взяты из жизни. К примеру, мы не говорим фразами, навроде: «если эта машина красная или эта красная, или эта красная, или...». Как правило, людей, которые так говорят, я встречаю не часто. Обычно мы говорим: «какая-то из этих машин красная». Объединения, т.е. jubctions, делают примерно то же самое.
Создание объединений из массива
if all(@scores) > $pass_mark {
say "Everybody passed!";
}
if any(@scores) > $pass_mark {
say "Somebody passed";
}
if one(@scores) > $pass_mark {
say "Just one person passed";
}
if none(@scores) > $pass_mark {
say "EPIC FAIL";
}
Автоматическое ветвление объединений
Если послать объединение в качестве параметра функции, то каждое из значений объединения создаст отдельный процесс выполнения функции:
sub example($x) {
say "called with $x";
}
example(1|2|3);
Результатом будет
called with 1
called with 2
called with 3
- Тип по умолчанию - Any
- Но это не корневой тип, это тип Object
- Объединения наследуются от Object, а не от Any
sub example(Junction $x) {
say "called with " ~ $x.perl;
}
example(1|2|3);
example(42);
Результат:
called with any(1, 2, 3)
Parameter type check failed for $x in call to example
Немного изменим код:
sub example(Object $x) {
say "called with " ~ $x.perl;
}
example(1|2|3);
example(42);
Тогда:
called with any(1, 2, 3)
called with 42
Возвращаемое объединением значение содержит свою собственную структуру:
sub double($x) {
return $x * 2;
}
my $x = double(1 | 2 & 3);
say $x.perl;
Результат:
any(2, all(4, 6))






































21 августа 2009, 10:07
Здесь более-менее понятно: en.wikibooks.org
Непонятно, что помешало привести все это в более-менее удобоваримый вид?
Пишем конструкторы данных, потом создаем особый оператор сравнения -- и все, junctions готовы.
В Haskell примерно:
data Any a = Any [a]
matchAny :: Eq a => a -> Any a -> Bool
matchAny x (Any y) = any (== x) y
И так далее для остальных.
Но можно так даже и не делать. ;)
21 августа 2009, 16:30
Но суть, надеюсь, понятна: выбор из нескольких значений:
$a ~~ any @a;
$a ~~ 1 | 2 | 3 | 4;
etc.