. 1 400 3, 5.000 1) 6.000 3, 600 VFL-3t8 60 5.000 O) 5.00 x 9.60 -43.00
Deploying Perl 6 · 2008. 10. 5. · •use 5.000; • use strict; • require 'fastcwd.pl'; •...
Transcript of Deploying Perl 6 · 2008. 10. 5. · •use 5.000; • use strict; • require 'fastcwd.pl'; •...
DeployingPerl 6
AudreyTang
1
Perl6ishereToday!
2
OldNews
3
Pugs&Parrot
4
Greatforexperimenting
5
Butnotforproduction
6
...notuntilChristmas
7
8
CPANisthelanguage
9
Perlisjustitssyntax
10
Perl5.000b3h(October1994)
11
• use5.000;• usestrict;• require'fastcwd.pl';• require'newgetopt.pl';• require'exceptions.pl';• #...•
12
Continuity++
13
Pugs6.2.2
(June2005)
14
• use v6-pugs;• use perl5:DBI;• use perl5:Encode;• use perl5:Template;• # ...•
15
StillneedtoinstallPugs
16
Perl5.9.3
(Jan2006)
17
• usev5.9.3;• usefeatureqw(switchsayerr~~);
• given(shift()){• when['‐h','‐‐help']{• say"Usage:$0";• }• default{• $0~~'moose.exe'errdie"NotMoose";• }• }•
18
HowtogetPerl6intoProduction?
19
Production
• Workwithexistingcode
• MustsupportPerl5andXS
• Norewrite‐from‐scratch
20
Frontends?
Parrot
Tcl Python Scheme
21
Frontends?
Parrot
Tcl Python Scheme
Perl 5(Ponie)
Perl 6
22
Backends!
Pugs
HaskellJava
ScriptPerl 5
23
Backends!
Pugs
JavaScript
Haskell Perl 5
YARV?JVM?
CLR? PyPy?
24
Pugs’sPerl5Backend
25
Perl6RuntimeImplementedin
Perl5
26
SanePerl5(notsourcefilters)
27
AvailableOnCPANToday
28
Moose.pm☯
29
Moose,it’sthenewCamel
30
ObjectsWithClass
31
• usev6‐pugs;• classPoint;• • • has$.xisrw;#instanceattributes• has$.y;#default"isreadonly"• • methodclear(){• • • $.x=0;#accessiblewithintheclass• $.y=0;• }•
32
• usev5;• packagePoint;• useMoose;• • hasx=>(is=>'rw');• hasy=>(is=>'ro');• • subclear{• my$self=shift;• • $self‐>{x}=0;• $self‐>y(0);• }•
33
Subclassing
34
• usev6‐pugs;• classPoint3D;• • • isPoint;• • has$.z;• • methodclear(){• • call;• $.z=0;• };•
35
• usev5;• packagePoint3D;• useMoose;• • extends'Point';• • hasz=>(isa=>'Int');• • overrideclear=>sub{• my$self=shift;• super;• $self‐>{z}=0;• };•
36
• usev5;• packagePoint3D;• useMoose;• • extends'Point';• • hasz=>(isa=>'Int');• • afterclear=>sub{• my$self=shift;• • $self‐>{z}=0;• };•
37
Constraints
38
• usev6‐pugs;• classBankAccount;• • • hasInt$.balanceisrw=0;•
• methoddeposit($amount){• • $.balance+=$amount;• }• • methodwithdraw($amount){• • my$current_balance=$.balance;• ($current_balance>=$amount)• errfail"Accountoverdrawn";• $.balance=$current_balance‐$amount;• }
39
• usev5;• packageBankAccount;• useMoose;• • hasbalance=>(• isa=>'Int',is=>'rw',default=>0• );• subdeposit{• my($self,$amount)=@_;• $self‐>balance($self‐>balance+$amount);• }• • subwithdraw{• my($self,$amount)=@_;• my$current_balance=$self‐>balance;• ($current_balance>=$amount)• ordie"Accountoverdrawn";• $self‐>balance($current_balance‐$amount);• }
40
• usev6‐pugs;• classCheckingAccount;• • isBankAccount;• • hasBankAccount$.overdraft_accountisrw;•
• methodwithdraw($amount){• • my$overdraft=$amount‐$.balance;• if($.overdraftand$overdraft>0){• $.overdraft_account.withdraw($overdraft);• $.deposit($overdraft);• }• call;• };•
41
• usev5;• packageCheckingAccount;• useMoose;• extends'BankAccount';• • hasoverdraft_account=>(• isa=>'BankAccount',is=>'rw'• );• beforewithdraw=>sub{• my($self,$amount)=@_;• my$overdraft=$amount‐$self‐>balance;• if($self‐>overdraft_accountand$overdraft>0){• $self‐>overdraft_account‐>withdraw($overdraft);• $self‐>deposit($overdraft);• }• • };•
42
Laziness
43
• usev6‐pugs;• classBinaryTreeisrw;• • hasAny$.node;• hasBinaryTree$.parenthandles{• parent_node=>'node'• };• hasBinaryTree$.left={• lazy{BinaryTree.new(parent=>self)}• };• hasBinaryTree$.right={• lazy{BinaryTree.new(parent=>self)}• };•
44
• usev5;• packageBinaryTree;• useMoose;• • hasnode=>(is=>'rw',isa=>'Any');• hasparent=>(• is=>'rw',• isa=>'BinaryTree',• handles=>{parent_node=>'node'},• weak_ref=>1,• );• hasleft=>(• is=>'rw',• isa=>'BinaryTree',• default=>sub{BinaryTree‐>new(parent=>$_[0])},• lazy=>1,• );
• #dittofor“hasright”
45
Subtypes
46
• usev6‐pugs;• classAddress;• useperl5:Locale::US;• useperl5:Regexp::Common<zip$RE>;• • my$STATES=Locale::US.new;• subsetUS_StateofStrwhere{• $STATES{any(<code2statestate2code>)}{.uc};• };• • hasStr$.streetisrw;• hasStr$.cityisrw;• hasUS_State$.stateisrw;• hasStr$.zip_codeisrwwhere{• $_~~$RE<zip><<US>{'‐extended'=>'allow'}• };•
47
• usev5;• packageAddress;• useMoose;• useMoose::Util::TypeConstraints;• useLocale::US;• useRegexp::Common'zip';• • my$STATES=Locale::US‐>new;• subtypeUSState=>asStr=>where{• $STATES‐>{code2state}{uc($_)}• or$STATES‐>{state2code}{uc($_)};• }• • hasstreet=>(is=>'rw',isa=>'Str');• hascity=>(is=>'rw',isa=>'Str');• hasstate=>(is=>'rw',isa=>'USState');• haszip_code=>(• is=>'rw',• isa=>subtypeStr=>where{• /$RE{zip}{US}{‐extended=>'allow'}/• },• );•
48
•Roles
•Coercion
•Metaclasses
Morefeatures
49
Pugs::Compiler::Rule☯
50
RegexObjects
51
• usev6‐pugs;
• my$txt='Car=ModelT,1909';• my$pat=rx{• Car‐• [(Ferrari)• |(ModelT,(\d\d\d\d))• ]• };• $txt~~$paterrfail"Cannotmatch";•
52
• usev5;• usePugs::Compiler::Regex;• my$txt='Car=ModelT,1909';• my$pat=Pugs::Compiler::Regex‐>compile(q(• Car‐• [(Ferrari)• |(ModelT,(\d\d\d\d))• ]• ));• $pat‐>match($txt)ordie"Cannotmatch";•
53
MatchObjects
54
• usev6‐pugs;
• my$pat=rx{• Car=[• (Ferrari)|(ModelT,(\d\d\d\d))• ]• };• • my$match=('Car=ModelT,1909'~~$pat);• say$match;#"Car=ModelT,1909"• say$match[0];#undef• say$match[1];#"ModelT,1909"• say$match[1][0];#"1909"• say$match[1][0].from;#11• say$match[1][0].to;#15•
55
• usev5;• usePugs::Compiler::Regex;• my$pat=Pugs::Compiler::Regex‐>compile(q(• Car=[• (Ferrari)|(ModelT,(\d\d\d\d))• ]• ));• usefeatureqw(say);• my$match=$pat‐>match('Car=ModelT,1909');• say$match;#"Car=ModelT,1909"• say$match‐>[0];#undef• say$match‐>[1];#"ModelT,1909"• say$match‐>[1][0];#"1909"• say$match‐>[1][0]‐>from;#11• say$match‐>[1][0]‐>to;#15•
56
NamedCaptures
57
• usev6‐pugs;• • my$pat=rx{• Car=[• (Ferrari)• |(ModelT,$<year>:=[\d\d\d\d])• ]• };
• my$match=('Car=ModelT,1909'~~$pat);• say$match;#"Car=ModelT,1909"• say$match[1];#"ModelT,1909"• say$match[1]<year>;#"1909"• say$match[1]<year>.from;#11• say$match[1]<year>.to;#15•
58
• usev5;• usePugs::Compiler::Regex;• my$pat=Pugs::Compiler::Regex‐>compile(q(• Car=[• (Ferrari)• |(ModelT,$<year>:=[\d\d\d\d])• ]• ));• usefeatureqw(say);• my$match=$pat‐>match('Car=ModelT,1909');• say$match;#"Car=ModelT,1909"• say$match‐>[1];#"ModelT,1909"• say$match‐>[1]{year};#"1909"• say$match‐>[1]{year}‐>from;#11• say$match‐>[1]{year}‐>to;#15•
59
GrammarModules
60
• usev6‐pugs;• • grammarCarInfo;• • regexcar{• Car=[(Ferrari)|(ModelT,<year>)]• }• regexyear{• \d\d\d\d• }• • moduleMain;• my$match=('Car=ModelT,1909'~~CarInfo.car);•
61
• usev5;• usePugs::Compiler::Regex;• packageCarInfo;• usebase'Pugs::Grammar::Base';• *car=Pugs::Compiler::Regex‐>compile(q(• Car=[(Ferrari)|(ModelT,<year>)]• ))‐>code;• *year=Pugs::Compiler::Regex‐>compile(q(• \d\d\d\d• ))‐>code;• • packagemain;• my$match=CarInfo‐>car('Car=ModelT,1909');•
62
ResultObjects
63
• #TypicalPerl5code• usev5;• my$txt='Car=ModelT,1909';• my$pat=qr{• Car=(?:(Ferrari)|(ModelT,(\d\d\d\d)))• }x;• my$obj;• if($txt=~$pat){• if($1){• $obj=Car‐>new(color=>"red");• }elsif($2){• $obj=Car‐>new(color=>"black",year=>$3);• }• }•
64
• usev6‐pugs;
• my$txt='Car=ModelT,1909';• my$pat=rx{• Car=[Ferrari• {returnCar.new(:color<red>)}• |ModelT,$<year>:=[\d\d\d\d]• {returnCar.new(:color<black>:$<year>)}• ]• };
• my$obj=$($txt~~$pat);• print$obj<year>;#1909
65
• usev5;• usePugs::Compiler::Regex;• my$txt='Car=ModelT,1909';• my$pat=Pugs::Compiler::Regex‐>compile(q(• Car=[Ferrari• {returnCar‐>new(color=>'red')}• |ModelT,$<year>:=[\d\d\d\d]• {returnCar‐>new(• color=>'black',year=>$<year>)}• ]• ));• my$obj=$pat‐>match($txt)‐>();• print$obj‐>{year};#1909
66
BacktrackControl
67
• usev6‐pugs;• "ModelT2005"~~regex{• Car=ModelT\d*;• };
68
• usev5;• "ModelT2005"=~qr{• Car=ModelT\d*;• }x;
69
• usev6‐pugs;• "ModelT2005"~~token{• Car=ModelT\d*;• }
70
• usev5;• "ModelT2005"=~qr{• Car=ModelT(?>\d*);• }x;
71
• usev6‐pugs;• "ModelT2005"~~rule{• Car=ModelT\d*;• }
72
• usev5;• "ModelT2005"=~qr{• Car\s*=\s*ModelT\s+(?>\d*)\s*;• }x;
73
Module::Compile☯
74
EveryonehatesSpiffy
75
• usev5;• useSpiffy‐Base;
• mysubprivate{• "It'saprivatemethodhere";• }
• subpublic{• $self‐>$private;• }
• subnew(){• my$self=super;• $self‐>init;• return$self;• }•
76
ToomuchMagic
77
YAMLusedSpiffy
78
Test::BaseusesSpiffy
79
IO::AllusesSpiffy
80
KwikiusesIO::All
81
Ergo...
82
EveryonehatesIngy
83
What'shatefulaboutSpiffy?
84
It'saSourceFilter!
85
• usev5;• useFilter::Simplesub{• s{(^sub\s+\w+\s+\{)}• {$1\nmy$self=shift;\n}mgx;• }•
86
•Addsdependency
•Slowsdownstartup
•Breaksperl‐d
•WrecksotherSourceFilters
Filter::SimpleBad
87
Wecanfixit!
88
• usev5;• useFilter::Simplesub{• s{(^sub\s+\w+\s+\{)}• {$1\nmy$self=shift;\n}mgx;• }
89
• usev5;• useFilter::Simple::Compilesub{• s{(^sub\s+\w+\s+\{)}• {$1\nmy$self=shift;\n}mgx;• }
90
Howdoesitwork?
91
Little‐knownfact:
92
“useFoo”looksforFoo.pmcbeforeFoo.pm
93
• %echo'print"Hello\n"'>Foo.pmc• %perl‐MFoo‐e1• Hello
94
Savefilteredresultto.pmc...
95
...nofilteringneedednexttime!
96
•Freeofuser‐sidedependencies
•Faststartuptime
•Debuggablesourceisallin.pmc
•Allowscomposableprecompilers
Module::CompileGood
97
• packageFoo;• useModule::Compile‐base;• • subpmc_compile{• my($class,$source,$context)=@_;• #Convert$sourceinto$compiled_output...• return$compiled_output;• }•
98
Filter::Simple::Compile
99
• #Drop‐inreplacementtoFilter::Simple• packageAcme::Y2K;• useFilter::Simple::Compilesub{• tr/y/k/;• }•
100
• #It'slexical!• {• useAcme::Y2K;• pacyageFoo;• mydir"tmp";• }• my$normal_code_here;•
101
Filter::Macro
102
• packageMyHandyModules;• useFilter::Macro;
• #linesbelowwillbeexpandedintocaller'scode• usestrict;• usewarnings;• useFatalqw(openclose);• useFindBinqw($Bin);•
103
• #Inyourcode• packageMyApp;• useMyHandyModules;• print"I'minvokedfrom$Bin";•
104
• #Makefile.PL• useinc::Module::Install;• • name'MyApp';• all_from'lib/MyApp.pm';• • pmc_support;
• WriteAll;•
105
Nodependencyon
MyHandyModules.pm
106
Inline::Module
107
• #Aww...• packageMyApp;• useFile::Slurpqw(slurp);• useHTTP::MessageParser;•
108
• #Yay!• packageMyApp;• useInline::Module'File::Slurp'=>qw(slurp);• useInline::Module'HTTP::MessageParser';•
109
ZeroDependencies
110
WhataboutDeployingPerl6?
111
usev6‐pugs;
112
v6.pm
113
WritePerl6compiletoPerl5
114
Source:Rule.pm
115
• usev6‐pugs;• • grammarPugs::Grammar::Rule;• rulews:P5{• ^((?:\s|\#(?‐s:.)*)+)• }• #...morerules...
116
Target:Rule.pmc
117
• #Generatedfile‐donotedit!• ##################(((32‐bitChecksumValidator)))##################• BEGIN{use5.006;local(*F,$/);($F=__FILE__)=~s!c$!!;open(F)• ordie"Cannotopen$F:$!";binmode(F,':crlf');unpack('%32N*',<F>)• ==0x1D6399E1ordie"Checksumfailedforoutdated.pmcfile:${F}c"}• #####################################################################• packagePugs::Grammar::Rule;• usebase'Pugs::Grammar::Base';• *{'Pugs::Grammar::Rule::ws'}=sub{• my$grammar=shift;• #warn"ruleargumentisundefined"unlessdefined$_[0];• $_[0]=""unlessdefined$_[0];• my$bool=$_[0]=~/^((?:\s|\#(?‐s:.)*)+)(.*)$/sx;• return{• bool=>$bool,• match=>$1,• tail=>$2,• #capture=>$1,• }• };• #...morerules...
118
Stillneedswork!
119
In Progress
120
IntrinsicObjectsMoose::Autobox
121
BuiltinObjectsPugs::Runtime::*
122
CallingConventionData::Bind
123
EvenMoreSugarre::override
124
TranslatorsMADPerl
125
Multiversioningonly.pm
126
CPANToolchainJIB.pm
127
Commitswelcome!
128
129
WhenwillPerl6bereleased?
☾
130
ByChristmas!
131
WhenPerl6isout,everydaywillbelike
Christmas!❆
132
Thank you!☺
133