Page 1
PugsPerl 6 on Haskell
AudreyTang1
Page 3
Pugs...
≝ Perl6Compiler
≝ Perl6Runtime
≝ Perl6TestSuite
3
Page 9
Perl6Code
✓ 119Modules
✓ 145Examples
✓ 11,550UnitTests
9
Page 12
• use v6-pugs;• use perl5:DBI;• use perl5:Encode;• use perl5:Template;• # ...
Perl5
12
Page 13
Parrot
Parrot
Tcl Python Scheme
Pugs
13
Page 14
Haskell
• inline Haskell => q[• fac :: Int -> Int• fac 0 = 1• fac x = x * fac (x - 1)• ];
14
Page 17
PugsIntermediateLanguage
17
Page 18
PILBackends
⇛ Perl5
⇛ Parrot
⇛ JavaScript
18
Page 21
6.0InitialRelease
䷁
21
Page 22
6.2Functions
䷗
22
Page 24
6.283Grammar
䷊
24
Page 25
6.2831TypeSystem
䷡
25
Page 26
6.28318Macros
䷪
26
Page 27
6.283185SelfHosting
䷀
27
Page 30
“FrivolousToyinterpreter”(asseenon/.)
30
Page 31
“FrivolousToyinterpreter”
31
Page 32
“FrivolousToyinterpreter”
32
Page 33
“Toyinterpreter”
33
Page 34
“Toyinterpreter”
34
Page 38
Arrowlength
Time
10000+commits
200+committers
38
Page 39
TestDriven
☺Bugreport➟Test
☺SmokeServer
☺:todo<unspecced>
39
Page 40
Anarchistic
☺20+Sub‐projects
☺10+Languages
☺ConstantReview
40
Page 41
PatchesWelcome!
41
Page 42
CommitsWelcome!
42
Page 44
irc.freenode.net#perl6
44
Page 45
λCamels✆ 100+People✆ 20+Regulars✆ TimToady✆ obra,leo,chip,pmichaud✆ rgs,ko1,why,xerox...
45
Page 50
MailingLists✆ perl6‐language
✆ perl6‐internals
✆ perl6‐compiler
✆ perl6‐users
50
Page 51
PlanetSix
✆ pugs.blogs.com
✆ perlsoc2006.blogspot.com
✆ Listsummaries
51
Page 52
...andallthoseWikis
52
Page 54
http://svn.openfoundry.org/pugs/
http://perlcabal.org/~audreyt/darcs/pugs/
SVK
Repositories
54
Page 55
SVK♜ OfflineBranches
♜ IncrementalMerge
♜ Client‐only:Fast!
♜ Perl6Ready
55
Page 58
Hackathon♨ Taipei
♨ Vienna
♨ Toronto
♨ Amsterdam
♨ Echt
♨ Lismore
♨ Mt.Arbel
♨ Vienna2
♨ Tokyo
♨ Redmond
♨ Chicago
♨ Boston
♨ Portland
♨ ...andmore!
58
Page 59
Erdösing♨ 2006..∞
59
Page 71
Abstractions➥Sexy
71
Page 72
Closuressubmake_counter{my$start=shift;returnsub{++$start};}my$from_ten=make_counter(10);my$from_three=make_counter(3);print$from_three‐>();#4print$from_three‐>();#5print$from_ten‐>();#11
72
Page 73
TieuseTie::Google;tiemy%search=>'Tie::Google','~/.googlekey';
for(@{$search{perl}}){print"*$_‐>{title}‐$_‐>{URL}\n";}
73
Page 74
Abstractions
∀ bless()
∀ IOLayers
∀ BEGIN{...}
74
Page 76
Shorthands➥Natural
76
Page 77
Shorthands
ℑ Regex
ℑ Context
ℑ Topical$_
77
Page 79
Nocoding➥bestcoding
79
Page 81
♡ 10+years
♡ 5000+authors
♡ 10000+modules
CPAN
81
Page 82
♡ PackageManagement
♡ Rating&Discussion
♡ SmokeTesting
♡ IssueTracking
Services
82
Page 83
Vocabulary≩Syntax
83
Page 84
“BestthinghappenedtoPerl”
84
Page 86
Perl5isn'tthebestthing
forCPAN
86
Page 88
SyntaxRedundancy
☣
88
Page 89
• usev5;• subrender{• my$self=shift;• my%opts=(x=>1,y=>1,z=>0,@_);• formy$item($self‐>filter(@{$self‐>{_items}})){• print$item‐>draw(• x=>$opts{x},• y=>$opts{y},• z=>$opts{z},• ),"\n";• }• }
89
Page 90
• usev6‐pugs;• methodrender($x=1,$y=1,$z=0){• [email protected] (@.items){• say.draw(:$x,:$y,:$z);• }• }•
90
Page 91
JengaInternals☣
91
Page 93
Bug‐for‐bugcompatibility
☣
93
Page 94
BestPracticetakesdiscipline
94
Page 96
BestPracticeshouldbeNatural!
96
Page 100
2002Apocalypses
100
Page 102
2004Synopses
102
Page 105
Pugs has been…
105
Page 106
Feb1TaPLarrived
asanexercise…
106
Page 107
Feb6PrimitiveInterpreter
(1|2)+(3|4)➥(4|5|6)
107
Page 108
Feb16ImperativeRuntime
say"Hello,world"
108
Page 110
Mar19PCRERegex
s:P5:g/5/6/;
110
Page 111
Apr26BEGINblocks
useCGI;111
Page 112
May8svnbot.p6
r2851|iblech++
112
Page 113
May5EmbeddedParrot
AddHandlermod_pugs
113
Page 114
May25Prelude.pm
subsprintf($fmt,*@args)
114
Page 115
May29EmbeddedPerl5
useperl5:DBI;115
Page 117
Jun2evalbot.p6
[#perl6]?eval1+1
117
Page 118
Jun24Perl6→PIL→Parrot
makesmoke‐pir118
Page 119
Jul14PIL→Perl5
makesmoke‐perl5
119
Page 120
Jul17PIL→JavaScript
makesmoke‐js
120
Page 121
Aug1Self‐hostingObjectModel
classClassisObject;
121
Page 122
Aug3KontentWiki
useperl5:Template;
122
Page 124
Oct9HaskellCabalSupport
libPugs.a124
Page 125
Nov2ndRuntimeAPISpec
Perl6::ObjectSpace
125
Page 126
Nov3ConcurrencySpec
subfisthrottled(:limit(3)){…}
126
Page 127
Nov4PackagingSpec
p5‐Foo‐1.0‐cpan+KANE.jib
127
Page 128
Nov7Coroutines
coro{yield}
128
Page 129
Nov231stcommitfromLarry(stillwaitingforGuido☺)
129
Page 131
Dec20LexicalImport
{useModule;…}
131
Page 132
Jan6YAMLSerialization
say$x.yaml;132
Page 133
Jan16Pugs/ParrotRuns!
parrotIsBrokenXXX=False
133
Page 134
Feb3Self‐parsingGrammar
grammarGrammar;134
Page 135
Feb14RulesengineinPerl5
Pugs::Compiler::Rule
135
Page 136
Feb22LarryJoins#perl6
<fglock>TimToady:welcome<Juerd>Justtrytonotgetaddicted:)<TimToady>Juerd:toolate…
136
Page 137
Feb24Perl6::DocTreeOverview/Tutorial
FAQ/Perl5/Spec/API
137
Page 138
Feb25CodeDOM
$ast=q:code/say"hi"/;
138
Page 140
Mar11Perl5Runtimeusev6‐pugs;
140
Page 141
Mar15DocDOMSpec
=insertCopyright.kwid
141
Page 142
Mar16BootstrappedonPerl5
lrep.p6lrep.p6
142
Page 143
Apr1CallingConventionSpec
$tree=\($obj:attr=>1,$child);
143
Page 144
Apr3UnicodeSpec
=encodingBig5
144
Page 145
Apr21MITLicense
145
Page 146
May8PredictiveParsing
<TimToady>"do,ordonot.thereisnotry..."
146
Page 147
May20HsSyck+ByteString
“makesmoke”➥14minutes
147
Page 149
June1SummerofCode
149
Page 150
SoC:Perl.org
☼ CompletePerl5ParserandPerl6Output
☼ Perl6DBIModule
☼ PugsSelf‐hostingBootstrapFromPerl5andRules
☼ SoftwareTransactionalMemoryforParrot
150
Page 151
SoC:Haskell.org
☼ FastMutableCollectionTypesforHaskell
☼ UnicodeByteString,Data.Rope,GenericParsec
151
Page 152
June4SoftwareTransactionalMemory
atomically{...}
152
Page 153
June6ImportfromEmbeddedPerl5
useperl5:Digest::MD5<md5_hex>;
153
Page 154
TodayPugs6.2.12
154
Page 156
ParrotRoadmap
Parrot
Tcl Python Scheme
156
Page 157
ParrotRoadmap
Parrot
Tcl Python Scheme
Perl 5(Ponie)
Perl 6
157
Page 158
PugsRoadmap
Pugs
JavaScript
Haskell Perl 5
158
Page 159
Pugs
JavaScript
Haskell Perl 5
YARV?JVM?
CLR? PyPy?
PugsRoadmap
159
Page 161
PopularObjectLanguage
161
Page 162
GeneratingJSژ Java:GoogleWebToolkit
ژ Perl:Jifty
ژ Ruby:Rails/JS
ژ Python:Pyjamas
ژ C#:Script#
162
Page 163
Samelanguageforbothsides
✓163
Page 164
Client‐sidejustatinysubset
✗164
Page 165
CompilingtoJS
ژ HOP/Scheme2JS
ژ Links
ژ HaXe
ژ Pugs!
165
Page 167
pugs‐BJS
• WritteninPerl5
• Passes90%oftests
• ~30kRuntime
167
Page 168
PIL2JSRuntime
• Primitives&Autoboxing
• Meta‐objectprotocol
• SupportsJSANlibraries
168
Page 169
JSAN
• "CPAN".replace(/CP/,"JS")
• ModulesystemwithPrototype.js
• Test.Simple,Jemplate,etc.
169
Page 170
Shortcomings
• Callingconventiontoocomplex
• CPSrunloopisslow
• Notailrecursionnorgoto
• Butthere'shope!
170
Page 171
JS2.0
• Selfhosting
• BacktranslatetoJS1
• Types,Modules,Continuations
• PartofFirefox3.0(nextyear)
171
Page 173
“CPANisthelanguagePerlisjustsyntax”
173
Page 177
YAML
• TaggedGraphs
• PerfectforASTs
• Syck:CbindingsfromRuby
177
Page 178
Inline.pm
• Reuseotherlanguage'slibraries
• SpiderMonkeyallowsJSAN+DBI
• ...butnotforProduction
178
Page 179
Production
• Existingcode
• NoGHC/SpiderMonkey/Parrot
• NoRewrite‐from‐scratch
• RunningonPerl5VM
179
Page 180
Perl5VM
• Activelydeveloped
• Widelydeployed
• JustneedaPerl6runtime
180
Page 182
ObjectsWithClass
182
Page 183
• usev6‐pugs;• classPoint;• • • has$.xisrw;#instanceattributes• has$.y;#default"isreadonly"• • methodclear(){• • • $.x=0;#accessiblewithintheclass• $.y=0;• }•
183
Page 184
• usev5;• packagePoint;• useMoose;• • hasx=>(is=>'rw');• hasy=>(is=>'ro');• • subclear{• my$self=shift;• • $self‐>{x}=0;• $self‐>y(0);• }•
184
Page 186
• usev6‐pugs;• classPoint3D;• • • isPoint;• • has$.z;• • methodclear(){• • call;• $.z=0;• };•
186
Page 187
• usev5;• packagePoint3D;• useMoose;• • extends'Point';• • hasz=>(isa=>'Int');• • overrideclear=>sub{• my$self=shift;• super;• $self‐>{z}=0;• };•
187
Page 188
• usev5;• packagePoint3D;• useMoose;• • extends'Point';• • hasz=>(isa=>'Int');• • afterclear=>sub{• my$self=shift;• • $self‐>{z}=0;• };•
188
Page 190
• usev6‐pugs;• classAddress;• useperl5:Locale::US;• useperl5:Regexp::Common<zip$RE>;• • my$STATES=Locale::US.new;• subsetUS_StateofStrwhere{• $STATES{any(<code2statestate2code>)}{.uc};• };• • hasUS_State$.stateisrw;• hasStr$.zip_codeisrwwhere{• $_~~$RE<zip><<US>{'‐extended'=>'allow'}• };•
190
Page 191
• 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($_)};• }• • hasstate=>(is=>'rw',isa=>'USState');• haszip_code=>(• is=>'rw',• isa=>subtypeStr=>where{• /$RE{zip}{US}{‐extended=>'allow'}/• },• );•
191
Page 193
• usev6‐pugs;• classBinaryTreeisrw;• • hasAny$.node;• hasBinaryTree$.parenthandles{• parent_node=>'node'• };• hasBinaryTree$.left={• lazy{BinaryTree.new(parent=>self)}• };• hasBinaryTree$.right={• lazy{BinaryTree.new(parent=>self)}• };•
193
Page 194
• 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”
194
Page 195
•Roles
•Coercion
•Metaclasses
Morefeatures
195
Page 196
Pugs::Compiler::Rule╬
196
Page 197
RegexObjects
197
Page 198
• usev6‐pugs;
• my$txt='Car=ModelT,1909';• my$pat=rx{• Car‐• [(Ferrari)• |(ModelT,(\d\d\d\d))• ]• };• $txt~~$paterrfail"Cannotmatch";•
198
Page 199
• 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";•
199
Page 200
MatchObjects
200
Page 201
• 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][1];#"1909"• say$match[1][1].from;#11• say$match[1][1].to;#15•
201
Page 202
• 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][1];#"1909"• say$match‐>[1][1]‐>from;#11• say$match‐>[1][1]‐>to;#15•
202
Page 203
NamedCaptures
203
Page 204
• 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•
204
Page 205
• 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•
205
Page 206
GrammarModules
206
Page 207
• usev6‐pugs;• • grammarCarInfo;• • regexcar{• Car=[(Ferrari)|(ModelT,<year>)]• }• regexyear{• \d\d\d\d• }• • moduleMain;• my$match=('Car=ModelT,1909'~~CarInfo.car);•
207
Page 208
• 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');•
208
Page 209
ResultObjects
209
Page 210
• #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);• }• }•
210
Page 211
• 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
211
Page 212
• 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
212
Page 213
Module::Compile§
213
Page 214
SourceFilter
214
Page 215
• usev5;• useFilter::Simplesub{• s{(^sub\s+\w+\s+\{)}• {$1\nmy$self=shift;\n}mgx;• }•
215
Page 216
•Addsdependency
•Slowsdownstartup
•Breaksperl‐d
•WrecksotherSourceFilters
Filter::SimpleBad
216
Page 218
• usev5;• useFilter::Simplesub{• s{(^sub\s+\w+\s+\{)}• {$1\nmy$self=shift;\n}mgx;• }
218
Page 219
• usev5;• useFilter::Simple::Compilesub{• s{(^sub\s+\w+\s+\{)}• {$1\nmy$self=shift;\n}mgx;• }
219
Page 220
Howdoesitwork?
220
Page 221
Little‐knownfact:
221
Page 222
“useFoo”looksforFoo.pmcbeforeFoo.pm
222
Page 223
• %echo'print"Hello\n"'>Foo.pmc• %perl‐MFoo‐e1• Hello
223
Page 224
Savefilteredresultto.pmc...
224
Page 225
...nofilteringneedednexttime!
225
Page 226
•Freeofuser‐sidedependencies
•Faststartuptime
•Debuggablesourceisallin.pmc
•Allowscomposableprecompilers
Module::CompileGood
226
Page 227
Filter::Simple::Compile
227
Page 228
• #Drop‐inreplacementtoFilter::Simple• packageAcme::Y2K;• useFilter::Simple::Compilesub{• tr/y/k/;• }•
228
Page 229
• #It'slexical!• {• useAcme::Y2K;• pacyageFoo;• mydir"tmp";• }• my$normal_code_here;•
229
Page 230
Filter::Macro
230
Page 231
• packageMyHandyModules;• useFilter::Macro;• #linesbelowwillbeexpandedintocaller'scode• usestrict;• usewarnings;• useFatalqw(openclose);• useFindBinqw($Bin);•
231
Page 232
• #Inyourcode• packageMyApp;• useMyHandyModules;• print"I'minvokedfrom$Bin";•
232
Page 233
Nodependencyon
MyHandyModules.pm
233
Page 234
WhataboutDeployingPerl6?
234
Page 236
Source:Rule.pm
236
Page 237
• usev6‐pugs;• • grammarPugs::Grammar::Rule;• rulews:P5{• ^((?:\s|\#(?‐s:.)*)+)• }• #...morerules...
237
Page 238
Target:Rule.pmc
238
Page 239
• #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...
239
Page 240
WritePerl6compiletoPerl5
⇪240
Page 241
Eclecticism☯
241
Page 244
Staticvs
Dynamic244
Page 245
•usev5;•subf{•sqrt($_[0]**2+$_[1]**2)•}•my$five=f(3,4);
245
Page 246
•usev6‐pugs;•subf{•sqrt(@_[0]**2+@_[1]**2)•}•my$five=f(3,4);
246
Page 247
OptionalAnnotations
247
Page 248
• subf(Num$x,Num$y){• sqrt($x**2+$y**2);• }• myNum$five=f(3,4);
•
248
Page 249
HybridTypeChecking
249
Page 250
• subsetPositiveofNumwhere{$_>0}
• subf(• Positive$x,Positive$y• ‐‐>Positivewhere{$_>=($x&$y)}• ){• sqrt($x**2+$y**2);• }
• my$five:=f(3,4);#inferredasPositive
•
250
Page 251
Compilervs
Runtime251
Page 252
BEGINBlock
• CompilerisaREPL
• Everythingisswappable
• Atendofcompilation,savetheobjectspace
252
Page 253
ExtensibleGrammar
253
Page 254
• subpostfix:<!>($x){• [*]1..$x• }• • say10!;#3628800
254
Page 255
SyntacticMacros
255
Page 256
• macrocircumfix:</**/>($x)• isparsed/.*?/• {''}• • /*ThisisaC‐stylecomment*/
•
256
Page 257
Caller‐siteMacros
257
Page 258
• macrohi(){• q:code(:COMPILING))• {"Hello,$s"}• }• my$s="world";• sayhi;#Hello,world
258
Page 260
ImplicitGenerators
260
Page 261
• my@fib:=(• 0,1,• each(@fib;@fib[1..*])• .map(&infix:<+>)• );
261
Page 262
ExplicitAnnotations
262
Page 263
• my$ignored=lazy{9**9**9}• my$unused=lazy{say[1..$ignored]}• print"Hello,world!"
263
Page 264
Classesvs
Prototypes264
Page 266
• classDogisMammaldoesPet{• my$countwhere0..100;• has$!brain;• has$nameisrw="fido";• has$furhandlesGroomable;• has$tailhandles<waghang>;• has&vocalize=&say;• methodowner()handless/^owner_//{...}• }
•
266
Page 267
• myDog$fido.=new;• #Dog.isa(Dog);$fido.isa(Dog);• • $fido.meta.add_method(• 'bark',• method(){$.vocalize('Woof!')}• );• #Dog.can('bark');$fido.can('bark');
267
Page 268
My Languagevs
Your Language268
Page 269
•usejsan:DOM;•useperl5:DBI;•useparrot:PGE;•usehaskell:Prelude;
269
Page 270
use Haskell;λ
270
Page 271
WhyHaskell?
• CodeasSpec
• ExplicitEffects
• Zerorefactoringcost
271
Page 272
http://perlcabal.org/~audreyt/tokyo/ecs-haskell.xul
272
Page 273
"Forceyoutoknowwhatyouaredoing."
273
Page 274
import Perl◉
274
Page 275
"Bestwhenyoudon'tknowwhatyouaredoing."
275
Page 277
FastMutableCollection
277
Page 278
UnicodeLayerOnByteStrings
278
Page 281
What’s Next?✈
281
Page 283
UpcomingHackathons
283
Page 284
YAPC::NAHackathon• “LearningPerl6”
• SpeedupPerl5runtime
• Parrotcallingconvention
• StandardizeMooseMOP
284
Page 285
BostonHackathon
• Perl6portingexercise
• IntegrateHsJudy
• BenchmarkingRuntimes
285
Page 286
WhenwillPerl6bereleased?
☾
286
Page 287
ByChristmas!
287
Page 288
WhenPerl6isout,everydaywillbelike
Christmas!❆
288