3. Что такое Perl 6?
Возьмем лучшее из Perl…
Практичность — акцент на решении задачи
Мультипарадигменность — потому что не
существует единственного подхода к решению
всех задач
Лингвистическое влияние — это же язык
программирования
Простые вещи просты, а сложные — возможны
4. Что такое Perl 6?
Построим новый Perl-подобный язык, который…
Более регулярен — меньше особых случаев
Более читаем и более поддерживаем
Более выразителен
Более ОО, более функциональный, более
декларативный, более параллельный…
Простое — просто
Сложное — еще более доступно
5. Одна спецификация, много реализаций
В отличие от Perl 5, для Perl 6 написана спецификация
языка
Нет «официальной» реализации
Как и в Perl 5, у Perl 6 есть набор тестов
Правильная реализация должна проходить набор
тестов
Это некая «исполняемая спецификация»
Сейчас около 40 000 тестов
7. Что такое Rakudo?
Наиболее активно разрабатываемый компилятор Perl 6
Реализует значительную часть спецификации Perl 6
(хотя еще есть, над чем работать)
Сегодня проходится более 30 000 тестов из набора
тестов Perl 6 (правда набор тестов растет )
Сейчас основан на виртуальной машине Parrot
В этом году мы планируем как минимум еще одну
платформу
8. Как работает Rakudo
Написан на…
NQP (минимальное подмножество Perl 6)
Ядро компилятора (грамматика и построение AST), некоторые
мета-модели, поиск и загрузка модулей)
Perl 6
Большинство встроенных функций и операторов
Parrot Intermediate Language
Некоторые низкоуровневые фукнции и «клей» (glue)
C
Диспетчеры, работа с сигнатурами, кастомизация VM и «клей»
9. Как работает Rakudo: парсинг
Сначала Rakudo разбирает программу
Парсер написан на регексах Perl 6
token statement_control:sym<if> {
<sym> :s
<xblock>
[ 'elsif's <xblock> ]*
[ 'else's <else=.pblock> ]?
}
Может находить новые операторы во время разбора
Должен сразу выполнять блоки BEGIN
10. Как работает Rakudo: построение AST
Когда заканчивается разбор чего-либо (например,
инструкции if), запускается action-метод
Он строит абстрактное синтаксическое дерево (Abstract
Syntax Tree, AST)
Это представление программы в абстрактом —
не зависимом от синтаксиса языка — виде
Большинство action-методов строят сложное AST
из маленьких фрагментов, которые уже разобраны
12. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Var.new(
:name('$x'),
:scope('lexical')
)
13. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
)
14. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new(
:pasttype('call'),
:name('&infix:<==>'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
)
15. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new(
:pasttype('call'),
:name('&infix:<==>'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
16. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new(
:pasttype('call'),
:name('&infix:<==>'),
… PAST::Op.new(
) :pasttype('call'),
:name('&say'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
17. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new( PAST::Block.new( … )
:pasttype('call'),
:name('&infix:<==>'),
… PAST::Op.new(
) :pasttype('call'),
:name('&say'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
18. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new( :pasttype('if'), … )
PAST::Op.new( PAST::Block.new( … )
:pasttype('call'),
:name('&infix:<==>'),
… PAST::Op.new(
) :pasttype('call'),
:name('&say'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
19. Как работает Rakudo: построение AST
if $x == 42 { say "The answer!"; }
PAST::Op.new( :pasttype('if'), … )
PAST::Op.new( PAST::Block.new( … )
:pasttype('call'),
:name('&infix:<==>'),
… PAST::Op.new(
) :pasttype('call'),
:name('&say'),
…
)
PAST::Var.new( PAST::Val.new(
:name('$x'), :value(42)
:scope('lexical') )
) PAST::Val.new(
:value('The Answer!')
)
20. Как работает Rakudo: генерация кода
Берем дерево AST и генерируем внутренний код под
целевую платформу
Сегодня на этом этапе мы делаем код только для
виртуальной машины Parrot
Акхитектура такова, что в будущем мы сможем
добавить другие бекенды
Кроме того, в этом месте последовательности
компиляции возможно выполнять фазы оптимизации и
анализа программы
22. Примеры
Рассмотрим набор небольших, посведневных
программистских задач и для каждой покажем…
код на Perl 6, решающий задачу
вывод после запуска
Надеюсь, это хорошее начало для того, чтобы понять
новый синтаксис и новые возможности
Покажу крутые фичи Perl 6
Все показанные сегодня примеры работают в Rakudo
24. Задача
Прочитать строку с консоли
Решение
print "Enter your name: ";
my $name = $*IN.get;
say "Hi $name!";
Вывод
Enter your name: Jonathan
Hi Jonathan!
25. Задача
Проверить, находится ли значение в данном диапазоне
Решение 1
loop {
print "Enter a number from 1 to 10: ";
my $num = $*IN.get;
unless 1 <= $num <= 10 { say "Fail!" }
}
Вывод
Enter a number between 1 and 10: 3
Enter a number between 1 and 10: 42
Fail!
26. Задача
Проверить, находится ли значение в данном диапазоне
Решение 2
loop {
print "Enter a number from 1 to 10: ";
my $num = $*IN.get;
unless $num ~~ 1..10 { say "Fail!" }
}
Вывод
Enter a number between 1 and 10: 3
Enter a number between 1 and 10: 42
Fail!
28. Задача
Проверить, отсортирован ли список
Решение
my @a = 1, 1, 2, 3, 5, 8;
my @b = 9, 4, 1, 16, 36, 25;
if [<=] @a { say '@a is sorted' }
if [<=] @b { say '@b is sorted' }
Вывод
@a is sorted
29. Задача
Пройтись по списку
Решение
my @cities = <Moscow Kazan Vladivostok>;
for @cities -> $city {
say "I've been to $city";
}
Вывод
I've been to Moscow
I've been to Kazan
I've been to Vladivostok
30. Задача
Пройтись по ключам и значениям хеша
Решение
my %distances = Bratislava => 1084, Stockholm => 442;
for %distances.kv -> $city, $distance {
say "$city is $distance km away";
}
Вывод
Bratislava is 1084 km away
Stockholm is 442 km away
31. Задача
Проверить, есть ли в списке результатов экзаменов хотя бы
один, превышающий порог
Решение
my @a = 75, 47, 90, 22, 80;
my @b = 61, 77, 94, 82, 60;
my @c = 45, 59, 33, 11, 19;
if any(@a) >= 60 { say "Some passes in A" }
if any(@b) >= 60 { say "Some passes in B" }
if any(@c) >= 60 { say "Some passes in C" }
Вывод
Some passes in A
Some passes in B
32. Задача
Проверить, все ли результаты экзаменов в списке
превышают порог
Решение
my @a = 75, 47, 90, 22, 80;
my @b = 61, 77, 94, 82, 60;
my @c = 45, 59, 33, 11, 19;
if all(@a) >= 60 { say "All passes in A" }
if all(@b) >= 60 { say "All passes in B" }
if all(@c) >= 60 { say "All passes in C" }
Вывод
All passes in B
33. Задача
Проверить, что ни один из результатов экзаменов в списке
не превышает порог
Решение
my @a = 75, 47, 90, 22, 80;
my @b = 61, 77, 94, 82, 60;
my @c = 45, 59, 33, 11, 19;
if none(@a) >= 60 { say "No passes in A" }
if none(@b) >= 60 { say "No passes in B" }
if none(@c) >= 60 { say "No passes in C" }
Вывод
No passes in C
34. Задача
Выбрать из списка случайный элемент
Решение
my @drinks = <wine beer vodka>;
say "Tonight I'll drink { @drinks.pick }";
Вывод (результат дожен меняться ;-))
Tonight I'll drink vodka
35. Задача
Перемешать список в случайном порядке
Решение
my @competitors = <Tina Lena Owen Peter>;
my @order = @competitors.pick(*);
for @order { .say }
Вывод (результат дожен меняться ;-))
Peter
Lena
Owen
Tina
36. Задача
Написать и вызвать подпрограмму с параметрами
Решение
sub greet($greeting, $name) {
say "$greeting, $name!";
}
greet("hello", "masak");
Вывод
hello, masak
37. Задача
Написать подпрограмму, принимающую только число
Решение
sub double(Num $n) { 2 * $n }
say double(21);
say double("oh no I'm not a number");
Вывод
42
Parameter type check failed; expected Num, but got Str
for $n in call to double
38. Задача
Вызвать нужную мульти-функцию в зависимости от типа
аргумента
Решение
multi double(Num $n) { 2 * $n }
multi double(Str $s) { $s x 2 }
say double(21);
say double("boo");
Вывод
42
booboo
41. Задача
Добавить новый оператор факториала (чтобы работало 10!)
Решение
sub postfix:<!>($n) { [*] 1..$n }
say 1!;
say 10!;
Вывод
1
3628800
42. Задача
Объявить класс с атрибутами и методами
Решение
class Product {
has $.name; # Атрибут + аксессор
has $!price; # Только атрибут
has $.discount is rw; # Атрибут + lvalue-аксессор
method get_price {
return $!price - $!discount;
}
}
43. Задача
Создать экземпляр класса и вызвать на нем метод
Решение
my $prod = Product.new(
name => "Beer",
price => 500,
discount => 60
);
say $prod.get_price;
Вывод
440
44. Задача
Прочитать/записать атрибут через аксессор
Решение
say $prod.name;
$prod.discount = 40;
say $prod.get_price;
$prod.name = 'Wine';
Вывод
Beer
460
Cannot assign to readonly variable.
45. Задача
Вызвать метод на каждом объекте из списка
Решение
my @products = Product.new(name => 'Beer', price => 500),
Product.new(name => 'Wine', price => 450),
Product.new(name => 'Vodka', price => 1600);
my @uc_names = @products>>.name>>.uc;
for @uc_names { .say }
Вывод
BEER
WINE
VODKA
46. Задача
Сделать интроспекцию, чтобы узнать методы класса
Решение
my @meths = Product.^methods(:local);
for @meths>>.name { .say }
Вывод
get_price
discount
name
47. Задача
Отсортировать список объектов с учетом вызова метода
Решение (пример 1)
my @products = Product.new(name => 'Beer', price => 500),
Product.new(name => 'Wine', price => 450),
Product.new(name => 'Vodka', price => 1600);
my @sorted = @products.sort(*.name);
for @sorted { .name.say }
Вывод (пример 1)
Beer
Vodka
Wine
48. Задача
Отсортировать список объектов с учетом вызова метода
Решение (пример 2)
my @products = Product.new(name => 'Beer', price => 500),
Product.new(name => 'Wine', price => 450),
Product.new(name => 'Vodka', price => 1600);
my @sorted = @products.sort(*.get_price);
for @sorted { .name.say }
Вывод (пример 2)
Wine
Beer
Vodka
49. Задача
Найти минимальное и максимальное значения в списке
Решение (пример 1)
my @temperatures = -3, 5, 7, 2, -1, -4, 0;
say "Minimum was " ~ @temperatures.min;
say "Maximum was " ~ @temperatures.max;
Вывод (решение 1)
Minimum was –4
Maximum was 7
50. Задача
Найти минимальное и максимальное значения в списке
Решение (пример 2)
my @products = Product.new(name => 'Beer', price => 500),
Product.new(name => 'Wine', price => 450),
Product.new(name => 'Vodka', price => 1600);
say "Cheapest: " ~ @products.min(*.get_price).name;
say "Costliest: " ~ @products.max(*.get_price).name;
Вывод (пример 2)
Cheapest: Wine
Costliest: Vodka
51. Задача
Реализовать игру «Камень, ножницы, бумага»
Решение (часть 1)
class Paper { }
class Scissor { }
class Stone { }
multi win(Paper, Stone) { "Выиграл" }
multi win(Scissor, Paper) { "Выиграл" }
multi win(Stone, Scissor) { "Выиграл" }
multi win(::T, T) { "Ничья" }
multi win(Any, Any) { "Проиграл" }
52. Задача
Реализовать игру «Камень, ножницы, бумага»
Решение (часть 2)
say win(Paper, Paper);
say win(Scissor, Stone);
say win(Stone, Scissor);
Вывод
Ничья
Проиграл
Выиграл
54. Что такое Rakudo *?
Заметный прогресс Rakudo
Постоянно реализуются новые части спецификации
Постоянно растет число пройденных тестов
Исправляется много багов
Растет число активных разработчиков
До сих пор мы фокусировались на процессе создания
Rakudo
Rakudo * — релиз, где мы фокусируемся на том, что
нужно первопроходцам
55. Что войдет в релиз?
Мы делаем релиз компилятора каждый месяц;
а Rakudo *, напротив, — дистрибутив, включающий:
Компилятор Rakudo, конечно же
Инструмент для загрузки, установки и обновления
модулей
Набор модулей Perl 6 для решения типовых задач
(например, HTTP-клиент и сервер, соединение с
базой данных, что-нибудь для веба, YAML…)
56. Что войдет в релиз?
Мы намереваемся включить пару других проектов…
Zavolaj! — модуль, позволяющих писать на Perl 6
обертки для библиотек C; на нем мы сделали
клиент MySQL
Blizkost — промежуточный слой Perl 5 Parrot,
котоырй позволит из Perl 6 использовать модули
Perl 5
57. Что Rakudo * будет делать хорошо
Rakudo хорошо покрывает большую часть
спецификации Perl 6…
Широкий выбор встроенных операторов, типов и функций
Подпрограммы, сигнатуры и множественная
диспетчеризация
ООП, включая классы, роли, интроспекцию и многое
другое
Perl 6 регексы и грамматики (именно ими мы делаем
разбор Perl 6!)
58. Слабые места
Rakudo * сможет многое предложить и окажется
полезным для многих задач
Однако, это не полный Perl 6, и, конечно, с
недостатками, например:
Отсутствие поддержки тредов
Отсутсвие поддержки нативных типов
Довольно медленный — еще не все оптимизировано,
и отсутствует оптимизатор
63. Как узнать больше?
Загрузите Rakudo Perl 6 с сайта
http://www.rakudo.org/
Много ссылок на ресурсы про Perl 6 собрано на сайте
http://www.perl6.org/
Присоединяйтесь к дружелюбному IRC-каналу
#perl6 on irc.freenode.org
Пишите модули, создавайте приложения,
включайтесь в развите сообщества Perl 6 и делайте
свой вклад в него