Submit Search
Upload
Написание DSL в Perl
•
0 likes
•
924 views
M
mayperl
Follow
YAPC Russia 2009 "May Perl 2"
Read less
Read more
Technology
Report
Share
Report
Share
1 of 94
Download now
Download to read offline
Recommended
Intro. to JavaScript
Intro. to JavaScript
Eric ShangKuan
SQLite in Android App (in tamil)
SQLite in Android App (in tamil)
Dr. Ramkumar Lakshminarayanan
211 Ch
211 Ch
anjaan
jQuery Tutorial
jQuery Tutorial
Eric ShangKuan
Hardware Interface in Android (in tamil)
Hardware Interface in Android (in tamil)
Dr. Ramkumar Lakshminarayanan
226 Ch
226 Ch
anjaan
Kata rules esp january 2013
Kata rules esp january 2013
Luis Gomez
JavaScript OOP
JavaScript OOP
Constantin Kichinsky
Recommended
Intro. to JavaScript
Intro. to JavaScript
Eric ShangKuan
SQLite in Android App (in tamil)
SQLite in Android App (in tamil)
Dr. Ramkumar Lakshminarayanan
211 Ch
211 Ch
anjaan
jQuery Tutorial
jQuery Tutorial
Eric ShangKuan
Hardware Interface in Android (in tamil)
Hardware Interface in Android (in tamil)
Dr. Ramkumar Lakshminarayanan
226 Ch
226 Ch
anjaan
Kata rules esp january 2013
Kata rules esp january 2013
Luis Gomez
JavaScript OOP
JavaScript OOP
Constantin Kichinsky
Estadistica cto 7
Estadistica cto 7
Luis Medina
Rating Bar in Android Example
Rating Bar in Android Example
Dr. Ramkumar Lakshminarayanan
Microsoft word -_lmn_tq
Microsoft word -_lmn_tq
ssuser2e4a96
(ISIA 3) Cours d'algorithmique (1995)
(ISIA 3) Cours d'algorithmique (1995)
Frank Nielsen
Аккредитация в достижении признания результатов оценки соответствия
Аккредитация в достижении признания результатов оценки соответствия
iskandaruz
P (1)
P (1)
maridulcete
Uso da TC nas Fraturas Faciais.
Uso da TC nas Fraturas Faciais.
LABMF -PE
Fiqh e Islami
Fiqh e Islami
Fahad Javed
JUNTOS SOMOS MELHORES - RICK WARREN
JUNTOS SOMOS MELHORES - RICK WARREN
Deonice E Orlando Sazonov
Bai Giang 8
Bai Giang 8
nbb3i
iReport實做練習part(1)
iReport實做練習part(1)
seatof
การใช้ Turbo C ชุดที่ 8 Array
การใช้ Turbo C ชุดที่ 8 Array
Know Mastikate
DS-019-機械設計基礎(簡體)Ok
DS-019-機械設計基礎(簡體)Ok
handbook
241 Ch
241 Ch
anjaan
창의적 기업문화를 말하다
창의적 기업문화를 말하다
Jinho Jung
20101114 synchronizing automata_volkov_lecture03
20101114 synchronizing automata_volkov_lecture03
Computer Science Club
Politrop
Politrop
eli priyatna laidan
Baz sagir wa kabir yaseen akhtar misbahi--22 sep
Baz sagir wa kabir yaseen akhtar misbahi--22 sep
sunnicreative
Satyanarayana Puja
Satyanarayana Puja
skillfulyards
Ведение документации в perl6: POD, да не тот !
Ведение документации в perl6: POD, да не тот !
mayperl
Wymiana Polsko Włoska 2
Wymiana Polsko Włoska 2
Carlissian
Распределенная обработка потоковых данных
Распределенная обработка потоковых данных
mayperl
More Related Content
What's hot
Estadistica cto 7
Estadistica cto 7
Luis Medina
Rating Bar in Android Example
Rating Bar in Android Example
Dr. Ramkumar Lakshminarayanan
Microsoft word -_lmn_tq
Microsoft word -_lmn_tq
ssuser2e4a96
(ISIA 3) Cours d'algorithmique (1995)
(ISIA 3) Cours d'algorithmique (1995)
Frank Nielsen
Аккредитация в достижении признания результатов оценки соответствия
Аккредитация в достижении признания результатов оценки соответствия
iskandaruz
P (1)
P (1)
maridulcete
Uso da TC nas Fraturas Faciais.
Uso da TC nas Fraturas Faciais.
LABMF -PE
Fiqh e Islami
Fiqh e Islami
Fahad Javed
JUNTOS SOMOS MELHORES - RICK WARREN
JUNTOS SOMOS MELHORES - RICK WARREN
Deonice E Orlando Sazonov
Bai Giang 8
Bai Giang 8
nbb3i
iReport實做練習part(1)
iReport實做練習part(1)
seatof
การใช้ Turbo C ชุดที่ 8 Array
การใช้ Turbo C ชุดที่ 8 Array
Know Mastikate
DS-019-機械設計基礎(簡體)Ok
DS-019-機械設計基礎(簡體)Ok
handbook
241 Ch
241 Ch
anjaan
창의적 기업문화를 말하다
창의적 기업문화를 말하다
Jinho Jung
20101114 synchronizing automata_volkov_lecture03
20101114 synchronizing automata_volkov_lecture03
Computer Science Club
Politrop
Politrop
eli priyatna laidan
Baz sagir wa kabir yaseen akhtar misbahi--22 sep
Baz sagir wa kabir yaseen akhtar misbahi--22 sep
sunnicreative
Satyanarayana Puja
Satyanarayana Puja
skillfulyards
What's hot
(19)
Estadistica cto 7
Estadistica cto 7
Rating Bar in Android Example
Rating Bar in Android Example
Microsoft word -_lmn_tq
Microsoft word -_lmn_tq
(ISIA 3) Cours d'algorithmique (1995)
(ISIA 3) Cours d'algorithmique (1995)
Аккредитация в достижении признания результатов оценки соответствия
Аккредитация в достижении признания результатов оценки соответствия
P (1)
P (1)
Uso da TC nas Fraturas Faciais.
Uso da TC nas Fraturas Faciais.
Fiqh e Islami
Fiqh e Islami
JUNTOS SOMOS MELHORES - RICK WARREN
JUNTOS SOMOS MELHORES - RICK WARREN
Bai Giang 8
Bai Giang 8
iReport實做練習part(1)
iReport實做練習part(1)
การใช้ Turbo C ชุดที่ 8 Array
การใช้ Turbo C ชุดที่ 8 Array
DS-019-機械設計基礎(簡體)Ok
DS-019-機械設計基礎(簡體)Ok
241 Ch
241 Ch
창의적 기업문화를 말하다
창의적 기업문화를 말하다
20101114 synchronizing automata_volkov_lecture03
20101114 synchronizing automata_volkov_lecture03
Politrop
Politrop
Baz sagir wa kabir yaseen akhtar misbahi--22 sep
Baz sagir wa kabir yaseen akhtar misbahi--22 sep
Satyanarayana Puja
Satyanarayana Puja
Viewers also liked
Ведение документации в perl6: POD, да не тот !
Ведение документации в perl6: POD, да не тот !
mayperl
Wymiana Polsko Włoska 2
Wymiana Polsko Włoska 2
Carlissian
Распределенная обработка потоковых данных
Распределенная обработка потоковых данных
mayperl
where the wild webmasters are
where the wild webmasters are
Pweng Bee
Курс Perl в УрГУ
Курс Perl в УрГУ
mayperl
Prezentacja01
Prezentacja01
Carlissian
Работа с большими файлами под перлом
Работа с большими файлами под перлом
mayperl
Perl в хэке и хэки в Perl
Perl в хэке и хэки в Perl
mayperl
Использование WebMoney в Perl
Использование WebMoney в Perl
mayperl
Сравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на Perl
mayperl
Use Perl like Perl
Use Perl like Perl
mayperl
Anyevent
Anyevent
mayperl
Perl + nginx = ♥
Perl + nginx = ♥
mayperl
IMAGES Foto-Ausstellungen 2011
IMAGES Foto-Ausstellungen 2011
edu.support
А у нас Perl 6 в production :)
А у нас Perl 6 в production :)
mayperl
The Story of the Bamboo
The Story of the Bamboo
Pweng Bee
Viewers also liked
(16)
Ведение документации в perl6: POD, да не тот !
Ведение документации в perl6: POD, да не тот !
Wymiana Polsko Włoska 2
Wymiana Polsko Włoska 2
Распределенная обработка потоковых данных
Распределенная обработка потоковых данных
where the wild webmasters are
where the wild webmasters are
Курс Perl в УрГУ
Курс Perl в УрГУ
Prezentacja01
Prezentacja01
Работа с большими файлами под перлом
Работа с большими файлами под перлом
Perl в хэке и хэки в Perl
Perl в хэке и хэки в Perl
Использование WebMoney в Perl
Использование WebMoney в Perl
Сравнение работы алгоритмов сортировки, реализованных на Perl
Сравнение работы алгоритмов сортировки, реализованных на Perl
Use Perl like Perl
Use Perl like Perl
Anyevent
Anyevent
Perl + nginx = ♥
Perl + nginx = ♥
IMAGES Foto-Ausstellungen 2011
IMAGES Foto-Ausstellungen 2011
А у нас Perl 6 в production :)
А у нас Perl 6 в production :)
The Story of the Bamboo
The Story of the Bamboo
More from mayperl
Тестирование в проекте REG.RU
Тестирование в проекте REG.RU
mayperl
Browser sniffing в 21 веке
Browser sniffing в 21 веке
mayperl
Что будет с Перлом?
Что будет с Перлом?
mayperl
Вебклуб Perlgolf.ru
Вебклуб Perlgolf.ru
mayperl
Making Your Own CPAN
Making Your Own CPAN
mayperl
Упаковка и развертывание программ на perl под debian
Упаковка и развертывание программ на perl под debian
mayperl
Groovy Vs Perl
Groovy Vs Perl
mayperl
10.000 вариантов снять квартиру или сам себе POE-риелтор
10.000 вариантов снять квартиру или сам себе POE-риелтор
mayperl
More from mayperl
(8)
Тестирование в проекте REG.RU
Тестирование в проекте REG.RU
Browser sniffing в 21 веке
Browser sniffing в 21 веке
Что будет с Перлом?
Что будет с Перлом?
Вебклуб Perlgolf.ru
Вебклуб Perlgolf.ru
Making Your Own CPAN
Making Your Own CPAN
Упаковка и развертывание программ на perl под debian
Упаковка и развертывание программ на perl под debian
Groovy Vs Perl
Groovy Vs Perl
10.000 вариантов снять квартиру или сам себе POE-риелтор
10.000 вариантов снять квартиру или сам себе POE-риелтор
Написание DSL в Perl
1.
DSLs в Perl
Как? Руслан Закиров <ruz@bestpractical.com> <ruz@bestpractical.com> Best Practical Solutions, 2008
2.
Что?
3.
under 'user/*' =>
run { my $u = U->load($1); ... }
4.
under 'user/*' =>
run { … abort(404) unless $u; on 'profile' => run {}; on 'stats' => run {}; on 'blog' => run {}; }
5.
Зачем?
6.
Выразительно
7.
Управляемо
8.
Как?
9.
Прототипы
10.
Прототипы ($) (&)
(@)
11.
Прототипы (завтрак) sub set($$)
{...} set key => $val;
12.
Прототипы (запястья)
()
13.
Прототипы (&)
блок функция
14.
Прототипы grep
{} @_ sub grep(&@) {}
15.
Методы
16.
Методы $o = new
X k => $v;
17.
Методы perl -e 'title
is „foo”;'
18.
Методы Невозможно найти метод
quot;titlequot; в пакете quot;isquot;
19.
Методы может вмы забыли
загрузить quot;isquot;?
20.
Методы этап исполнения
21.
Методы perl -e 'sub
foo { title is „foo” }' нет ошибки
22.
Методы my $a =
{}; local *is::AUTOLOAD = sub { shift; # is $a->{$AUTLOAD} = join ' ', @_ }; $call->(); # что-то
23.
Объединим
24.
Объеденим (img_simple.pl) sub img(&)
{ my $code = shift; my %attr; local *is::AUTOLOAD = sub {...}; $code->(); my $attrs = join ' ', map $_.'=”'.$attr{$_}, keys %attr; print „<img $attrs />”; }
25.
Слишком просто?
26.
Усложним (img_strict.pl) my %attr_checks
= ( img => { _mandatory => [qw(src alt)], src => { canonicalizer => sub {...}, provides => sub {...}, }, # ... }, );
27.
Усложним (img_strict.pl) canonicalizer =>
sub { return quot;/static/images/$_[0]quot; unless $_[0] =~ /^//; return $_[0]; }
28.
Усложним (img_strict.pl) provides =>
sub { return unless my ($w, $h) = ($_[0] =~ /-(d+)x(d+)./); return (width => $w, height => $h); }
29.
Результат (img_strict.pl) img {
alt is 'feed', src is 'f-14x14.png' };
30.
Результат (img_strict.pl) <img width=quot;14quot;
height=quot;14quot; alt=quot;feedquot; src=quot;/s/i/f-14x14.pngquot; />
31.
Отладка
32.
Отладка (carp.pl)
нет атрибута 'boo' у тега 'img' at carp.pl line 10
33.
Отладка (carp.pl) local $Carp::CarpLevel
= 1; Carp::croak(...);
34.
Отладка (carp.pl)
нет атрибута 'boo' у тега 'img' at carp.pl line 16 место вызова
35.
Отладка (carp.pl)
main::__ANON__() main::__ANON__() called at carp.pl line 13
36.
Отладка (carp.pl) sub img(&)
{ local *__ANON__ = quot;img_implquot;; ... }
37.
Отладка (carp.pl) bla-bla at
carp.pl line 17 main::img_impl() called at... main::img_impl() main::img('CODE(...)') called at...
38.
Грабли №1
39.
Грабли №1 page {...}; sub
page(&) {...};
40.
Грабли №1 Невозможно вызвать
метод quot;pagequot; без пакета или объекта
41.
Грабли №2
42.
Грабли №2 sub page(&)
{ local *title::page = sub {} shift->(); }; page { page title „qwe” };
43.
Грабли №2
Методы проигрывают протипам
44.
Избавляемся от
методов
45.
Без методов (wo_methods.pl) our
%ATTR; sub attrs(&) { %ATTR = shift->() } sub img(&) { local %ATTR; $code->(); ... }
46.
Без методов (wo_methods.pl) img
{ attrs { alt => 'boo', src => 'href' } };
47.
Вложенные структуры
48.
Вложения (div_simple.pl) <div><div>
что-то </div></div>
49.
Вложения (div_simple.pl) sub div(&)
{ my $code = shift; my $inside = $code->(); return quot;<div>$inside</div>quot;; } print div { div {'some'} };
50.
Если что-то сложнее?
51.
Усложняем div { div
{1};div{2} };
52.
Усложняем <div> <div>2</div> </div>
53.
Усложняем Фигня вышла
54.
Простое решение
55.
Простое решение (div_sol1.pl) sub
div(&) { my $code = shift; my @inside = $code->(); return quot;<div>@inside</div>quot;; }
56.
Простое решение (div_sol1.pl) print
div { div {1}, div {2} }, div { div {3}, div {4} };
57.
Код не вставишь
:(
58.
явный print
отстой
59.
запятые в топку
60.
Да прибудут с вами
контексты
61.
Контексты (context1.pl) unless (
defined wantarray ) { # void } elsif ( wantarray ) { # array } else { # scalar }
62.
Контексты sub div(&) {
my $res = join '', shift->(); unless ( defined wantarray ) { print „<div>$res</div>”; } else { return „<div>$res</div>”; } }
63.
Контексты (context1.pl) div {
div {1}; div {2} }; <div>1</div> <div><div>2</div></div>
64.
Буферизация
65.
Бу-эфиры (buffers1.pl) sub buffered
{ my $buf = ''; local *STDOUT; open STDOUT, '>', $buf; return $buf . join('', shift->()); }
66.
Бу-эфиры (buffers1.pl) sub div(&)
{ my $res = buffered(shift); return „<div>$res</div>” if defined wantarray; print „<div>$res</div>”; }
67.
Бу-эфиры (buffers1.pl) div {
div{'menu'}; my $some = 'some'; div{$some}, div{'tail'} };
68.
ЯХУ! :)
69.
Грабли №3
70.
Грабли №3 div {
'some'; my $some = 'some'; div{$some} };
71.
Грабли №3 print 'some'; outs('some'); x
{'some'} { my $x=...; 'some', div{$x} }
72.
Установка функций
73.
Установка функций my @tags
= qw(a b); foreach my $t ( @tags ) { no strict 'refs'; *{'main::'.$t} = sub (&) { ... }; }
74.
Установка функций sub import;
Exporter; Symbol; И прочие
75.
Прото-цепочки
76.
Это не химия И
не биология
77.
Это (&;$)
78.
Прото-цепочки sub a(&;$) {
print 'a ', context wantarray, quot;nquot; } sub b(&;$) { print 'b ', context wantarray, quot;nquot; }
79.
Прото-цепочки a {} b
{}; b scalar a void
80.
Промежуточное прдставление
81.
Пром-представления *{'main::'.$t} = sub
(&;$) { my ($code, $next) = @_; unless ( defined wantarray ) { return _tag($t, $code, $next); } else { return bless sub { return _tag($t, $code, $next) }, 'MyTag'; } };
82.
Пром-представления package MyTag; use overload
'quot;quot;' => sub { return buffered($_[0]) }; 1;
83.
Пром-представления a
{'head'} b {'middle'} c {'tail'}; im_represent.pl
84.
Экранирование
85.
Экранирование sub _escape {
return unless defined $_[0]; my $v = shift; $v = „$v”; „$v”; $v =~ s/.../.../g; return $v; }
86.
Экранирование sub escape(@_) {
return map blessed($_) && $_->isa('MyTag') ? $_ : _escape($_), @_; }
87.
Экранирование sub buffered {
... return join '', $buf, escape(@tail); } sub _tag { my ($tag, $code, $next) = @_; ... print join '', $res, escape $next; }
88.
Все работает escaping.pl
89.
На закуску к
экранам sub outs(@) { print _escape(join '', @_) } sub raw(@) { print join '', @_ } # грабли №3 div { outs('some'); div {...} };
90.
MyTD готов. Осталось
только...
91.
Недостающие части объединить все
примеры запаковать все sub template($$); # template 'index' => run {}; sub show($@); # show 'index', arg => $arg, ...;
92.
Посмотреть Template::Declare Jifty::Dispatcher Jifty::Param::Schema Jifty::DBI::Schema Object::Declare B::*
93.
ВСЕ
94.
Вопросы?
Download now