Привет всем, кто продолжает следить за 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))

shootnix
shootnix
21 августа 2009, 01:20
 2  
просмотров
732
4
 
chiaroscuro
21 августа 2009, 10:07
0
Сумбур-бумбур, честное слово.

Здесь более-менее понятно: en.wikibooks.org
Непонятно, что помешало привести все это в более-менее удобоваримый вид?

Пишем конструкторы данных, потом создаем особый оператор сравнения -- и все, junctions готовы.

В Haskell примерно:

data Any a = Any [a]

matchAny :: Eq a => a -> Any a -> Bool
matchAny x (Any y) = any (== x) y

И так далее для остальных.

Но можно так даже и не делать. ;)
shootnix
21 августа 2009, 16:30
0
Да, маленько увлекся…
Но суть, надеюсь, понятна: выбор из нескольких значений:
$a ~~ any @a;
$a ~~ 1 | 2 | 3 | 4;
etc.
Чтобы оставлять комментарии, Вы должны быть авторизованы. Если у Вас нет логина, то пройдите регистрацию.
участники
shootnix
Rex
edmond-mouse
mikusya
Legend_FoX
PeterWilson
askhattk
barmaglot
wwax
tima888
t-sh
Sigurt
zloyrusskiy
goodev
10275
PILIGRIM
войти
зарегистрироваться
сообщества
последние записи
записи по обсуждениям
записи по рейтингу
создать новое сообщество
личные блоги
последние записи
записи по обсуждениям
люди
самые активные
новые
по городам
по интересам
блог проекта
правила участия
помощь
мы на других сайтах
реклама
конкурсы
контакты
WebEverywhere, 2008-2010

Lyakhov.KZ - Большая энциклопедия Казнета Lyakhov.KZ - Большая энциклопедия Казнета