Всем привет. Среда — день Perl-поста. Сегодня поговорим еще об одной интересной вещи в Perl 6, которая, думаю, многим понравится.

Но прежде позвольте мне познакомить вас с еще одним интересным ресурсом, посвященным перлу — onperl.ru. Пока частота постов там — раз в сутки, так что интересно.

Итак, начинаем разговор о Мультифункциях.

Ранее мы уже знакомились с тем, как выглядят подпрограммы в Perl 6. Мы знаем, что они (подпрограммы), в отличие от Perl 5, имеют описания. Но это еще не все. В Perl 6 вы можете создавать разные функции с одним именем, используя различные описания.

Для этого нужно явно сказать перлу, что эта подпрограмма является мульти-функцией:

multi sub hello ...
multi sub hello ...

Работает это так: рантайм-машина анализирует передаваемые в функцию параметры и вызывает именно ту, которая будет лучше всего соответствовать. На языке разработчиков, такая функция называется «кандидат».

При этом, никто не гарантирует, что функция-кандидат, выбранная Perl 6 будет именно той, что вы хотите. Просто perl 6 вызовет ту, что ближе всего, по его мнению, стоит в описании. Но отчаиваться не нужно — Perl 6 достаточно умен, чтобы понимать разницу в описании функций по нескольким критериям.

Выбор по количеству передаваемых параметров

multi sub greet($name) {
say "Ahoj, $name!";
}
multi sub greet($name, $greeting) {
say "$greeting, $name!";
}
greet('Anna'); # Ahoj Anna
greet('Лена', 'Привет '); # Привет, Лена"

В этом случае, рантайм-машина ищет «кандидата» по количеству переданных в него аргументов.

Выбор по типу передаваемых параметров

multi sub double(Num $x) {
return 2 * $x;
}
multi sub double(Str $x) {
return "$x $x";
}
say double(21); # 42
say double("hej"); # hej hej

Камень-ножницы-бумага теперь просто:

class Paper { }
class Scissor { }
class Stone { }
multi win(Paper $a, Stone $b) { 1 }
multi win(Scissor $a, Paper $b) { 1 }
multi win(Stone $a, Scissor $b) { 1 }
multi win(Any $a, Any $b) { 0 }
say win(Paper.new, Scissor.new); # 0
say win(Stone.new, Stone.new); # 0
say win(Paper.new, Stone.new); # 1

shootnix
shootnix
19 августа 2009, 00:30
 5  
просмотров
546
5
 
dr_tarr
19 августа 2009, 08:48
1
Паттерн-матчинг значит. Хорошо.
chiaroscuro
19 августа 2009, 08:56
1
Точнее будет сказать, что тут мультиметоды из CLOS. O_o
shootnix
19 августа 2009, 11:55
0
Похоже, ага. Но, насколько я понял, в CLOS методы не описываются внутри класса. В перле можно. Это, опять-таки, еще одна возможность, а не правило.
milkfake
19 августа 2009, 16:05
1
Старик перл еще жив. Это радует. Первый язык программирования, который я изучил самостоятельно =)
shootnix
19 августа 2009, 16:09
0
Ну жив-то он жив, только у него есть один «фундаментальный недостаток», как писали на ЛОРе — его еще нет :-)))
Чтобы оставлять комментарии, Вы должны быть авторизованы. Если у Вас нет логина, то пройдите регистрацию.
участники
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 - Большая энциклопедия Казнета