perl 6: for little tools and large applications
TRANSCRIPT
![Page 1: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/1.jpg)
Jonathan Worthington
Perl 6: For Little Tools and
Large Applications
![Page 2: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/2.jpg)
Perl 6: For Little Tools and Large Applications
.WHO
![Page 3: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/3.jpg)
Perl 6: For Little Tools and Large Applications
Perl 6 Hacker
Rakudo core developer
Focus on the object model,
type system, multiple
dispatch and signature
handling
![Page 4: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/4.jpg)
Perl 6: For Little Tools and Large Applications
Traveller
I love to travel. Often Perl
workshops are a good excuse.
![Page 5: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/5.jpg)
Perl 6: For Little Tools and Large Applications
Beer Drinker
Beer is tasty.
I drink it.
\/
![Page 6: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/6.jpg)
Perl 6: For Little Tools and Large Applications
The Perl 6
Project
![Page 7: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/7.jpg)
Perl 6: For Little Tools and Large Applications
Take all of the
things that make
Perl great.
![Page 8: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/8.jpg)
Perl 6: For Little Tools and Large Applications
Learn from the
things that don’t
work so well in
Perl 5.
![Page 9: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/9.jpg)
Perl 6: For Little Tools and Large Applications
Be inspired by the
latest and greatest
ideas from other
languages and
language research.
![Page 10: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/10.jpg)
Perl 6: For Little Tools and Large Applications
Build a new Perl.
![Page 11: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/11.jpg)
Perl 6: For Little Tools and Large Applications
Perl 6
=
Language
specification
+
Official test suite
![Page 12: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/12.jpg)
Perl 6: For Little Tools and Large Applications
No official
implementation.
![Page 13: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/13.jpg)
Perl 6: For Little Tools and Large Applications
Rakudo is the most
complete Perl 6
implementation today.
![Page 14: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/14.jpg)
Perl 6: For Little Tools and Large Applications
Different use
cases have
different needs
![Page 15: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/15.jpg)
Perl 6: For Little Tools and Large Applications
I want a one-liner
that computes the
mean of the
values in the third
column in foo.txt.
![Page 16: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/16.jpg)
Perl 6: For Little Tools and Large Applications
I want to write a
large web app to
manage train
ticket sales for a
whole country.
![Page 17: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/17.jpg)
Perl 6: For Little Tools and Large Applications
I want a little tool
that downloads
and processes a
file in a weird
format once a day.
![Page 18: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/18.jpg)
Perl 6: For Little Tools and Large Applications
I want to work
with a huge set of
bioinformatics
data and do some
analysis on it.
![Page 19: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/19.jpg)
Perl 6: For Little Tools and Large Applications
In Perl 6, we've
tried to make things
better for all of
these use cases.
![Page 20: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/20.jpg)
Perl 6: For Little Tools and Large Applications
For the Really
Little Tasks
![Page 21: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/21.jpg)
Perl 6: For Little Tools and Large Applications
Perl 6 has a built-in
REPL.
> 15 + 27
42
![Page 22: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/22.jpg)
Perl 6: For Little Tools and Large Applications
Perl 6 has a built-in
REPL.
> 15 + 27
42
> <beer vodka whisky>.pick
beer
![Page 23: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/23.jpg)
Perl 6: For Little Tools and Large Applications
Perl 6 has a built-in
REPL.
> 15 + 27
42
> <beer vodka whisky>.pick
beer
> (1, 1, *+* ... Inf)[20]
10946
![Page 24: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/24.jpg)
Perl 6: For Little Tools and Large Applications
Pipeline operator is great
for processing lists of data
quickly and clearly
> dir ==> grep /\.pm$/
A.pm B.pm Foo.pm NativeCall.pm Test.pm x.pm
![Page 25: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/25.jpg)
Perl 6: For Little Tools and Large Applications
Pipeline operator is great
for processing lists of data
quickly and clearly
> dir ==> grep /\.pm$/
A.pm B.pm Foo.pm NativeCall.pm Test.pm x.pm
cat essay.txt | perl6 -e
'$*IN.slurp.comb(/\w+/) ==> sort *.chars
==> reverse ==> join "\n" ==> say' | head
![Page 26: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/26.jpg)
Perl 6: For Little Tools and Large Applications
slurp reads a file into a scalar
lines reads the lines of a file
into an array
> dir ==> grep /\.pm$/ ==> sort { +lines($_) }
B.pm x.pm A.pm Foo.pm NativeCall.pm Test.pm
> dir ==> grep /\.pm$/ ==>
sort { slurp($_).chars }
B.pm x.pm Foo.pm A.pm NativeCall.pm Test.pm
![Page 27: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/27.jpg)
Perl 6: For Little Tools and Large Applications
Many meta-operators
save writing loops
cat example.txt | perl6 -e
"say [max] $*IN.slurp.comb(/\d+/)"
![Page 28: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/28.jpg)
Perl 6: For Little Tools and Large Applications
Meta-operators save
writing a lot of loops
cat example.txt | perl6 -e
"say [max] $*IN.slurp.comb(/\d+/)"
cat data.txt | perl6 -e
"say [+] $*IN.lines.map: { .words[2] }"
![Page 29: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/29.jpg)
Perl 6: For Little Tools and Large Applications
Meta-operators save
writing a lot of loops
cat example.txt | perl6 -e
"say [max] $*IN.slurp.comb(/\d+/)"
cat data.txt | perl6 -e
"say [+] $*IN.lines.map: { .words[2] }"
perl6 -e "[+] lines(‘d1‘).map: { .words[2] }
>>-<<
lines(‘d2').map: { .words[2] }"
![Page 30: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/30.jpg)
Perl 6: For Little Tools and Large Applications
For The
Small Tools
![Page 31: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/31.jpg)
Perl 6: For Little Tools and Large Applications
Perl 6 supports writing a
MAIN subroutine that is
invoked at startup.
Automatically maps
arguments to parameters
and generates usage
instructions.
![Page 32: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/32.jpg)
Perl 6: For Little Tools and Large Applications
sub MAIN($number, Bool :$upto) {
my @fib := (1, 1, *+* ... Inf);
if $upto {
say join ',', @fib[0 ..^ $number];
}
else {
say @fib[$number - 1];
}
}
$ perl6 fib.pl 10
55
![Page 33: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/33.jpg)
Perl 6: For Little Tools and Large Applications
sub MAIN($number, Bool :$upto) {
my @fib := (1, 1, *+* ... Inf);
if $upto {
say join ',', @fib[0 ..^ $number];
}
else {
say @fib[$number - 1];
}
}
$ perl6 fib.pl --upto 10
1,1,2,3,5,8,13,21,34,55
![Page 34: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/34.jpg)
Perl 6: For Little Tools and Large Applications
sub MAIN($number, Bool :$upto) {
my @fib := (1, 1, *+* ... Inf);
if $upto {
say join ',', @fib[0 ..^ $number];
}
else {
say @fib[$number - 1];
}
}
$ perl6 fib.pl
Usage:
fib.pl [--upto] number
![Page 35: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/35.jpg)
Perl 6: For Little Tools and Large Applications
Multiple dispatch means you can
write multiple subs with the
same name but taking different
numbers or types of parameters.
multi sub todo($reason, $count) {
$todo_upto_test_num = $num_of_tests_run + $count;
$todo_reason = '# TODO ' ~ $reason;
}
multi sub todo($reason) {
$todo_upto_test_num = $num_of_tests_run + 1;
$todo_reason = '# TODO ' ~ $reason;
}
![Page 36: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/36.jpg)
Perl 6: For Little Tools and Large Applications
Can write multiple MAIN subs
multi sub MAIN('send', $filename) {
…
}
multi sub MAIN('fetch', $filename) {
…
}
multi sub MAIN('compare', $file1, $file2) {
…
}
$ perl6 util.p6
Usage:
util.p6 send filename
or
util.p6 fetch filename
or
util.p6 compare file1 file2
![Page 37: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/37.jpg)
Perl 6: For Little Tools and Large Applications
When working with all but the
simplest data files, often need to
do some parsing
Perl 6 grammars allow you to
write re-usable parsers
Get back a tree of match objects
have a data structure to start
looking into
![Page 38: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/38.jpg)
Perl 6: For Little Tools and Large Applications
Write a script that works out
the country we sold the most
trips to today.
Russia
Vladivostok : 43.131621,131.923828 : 4
Ulan Ude : 51.841624,107.608101 : 2
Saint Petersburg : 59.939977,30.315785 : 10
Norway
Oslo : 59.914289,10.738739 : 2
Bergen : 60.388533,5.331856 : 4
Ukraine
Kiev : 50.456001,30.50384 : 3
Switzerland
Wengen : 46.608265,7.922065 : 3
Bern : 46.949076,7.448151 : 1
...
![Page 39: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/39.jpg)
Perl 6: For Little Tools and Large Applications
What a lovely non-
standard file format.
Let's write a grammar
for it!
![Page 40: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/40.jpg)
Perl 6: For Little Tools and Large Applications
grammar SalesExport {
…
}
![Page 41: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/41.jpg)
Perl 6: For Little Tools and Large Applications
grammar SalesExport {
token TOP { ^ <country>+ $ }
…
}
![Page 42: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/42.jpg)
Perl 6: For Little Tools and Large Applications
grammar SalesExport {
token TOP { ^ <country>+ $ }
token country {
<name> \n
<destination>+
}
…
}
Russia
Vladivostok : 43.131621,131.923828 : 4
Ulan Ude : 51.841624,107.608101 : 2
Saint Petersburg : 59.939977,30.315785 : 10
![Page 43: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/43.jpg)
Perl 6: For Little Tools and Large Applications
grammar SalesExport {
token TOP { ^ <country>+ $ }
token country {
<name> \n
<destination>+
}
token destination {
\t <name> \s+ ':' \s+
…
}
…
}
Vladivostok : 43.131621,131.923828 : 4
![Page 44: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/44.jpg)
Perl 6: For Little Tools and Large Applications
grammar SalesExport {
token TOP { ^ <country>+ $ }
token country {
<name> \n
<destination>+
}
token destination {
\t <name> \s+ ':' \s+
<lat=.num> ',' <long=.num> \s+ ':' \s+
…
}
…
}
Vladivostok : 43.131621,131.923828 : 4
![Page 45: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/45.jpg)
Perl 6: For Little Tools and Large Applications
grammar SalesExport {
token TOP { ^ <country>+ $ }
token country {
<name> \n
<destination>+
}
token destination {
\t <name> \s+ ':' \s+
<lat=.num> ',' <long=.num> \s+ ':' \s+
<sales=.integer> \n
}
…
}
Vladivostok : 43.131621,131.923828 : 4
![Page 46: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/46.jpg)
Perl 6: For Little Tools and Large Applications
grammar SalesExport {
token TOP { ^ <country>+ $ }
token country {
<name> \n
<destination>+
}
token destination {
\t <name> \s+ ':' \s+
<lat=.num> ',' <long=.num> \s+ ':' \s+
<sales=.integer> \n
}
token name { \w+ [ \s \w+ ]* }
…
}
![Page 47: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/47.jpg)
Perl 6: For Little Tools and Large Applications
grammar SalesExport {
token TOP { ^ <country>+ $ }
token country {
<name> \n
<destination>+
}
token destination {
\t <name> \s+ ':' \s+
<lat=.num> ',' <long=.num> \s+ ':' \s+
<sales=.integer> \n
}
token name { \w+ [ \s \w+ ]* }
token num { '-'? \d+ [\.\d+]? }
token integer { '-'? \d+ }
}
![Page 48: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/48.jpg)
Perl 6: For Little Tools and Large Applications
grammar SalesExport {
token TOP { ^ <country>+ $ }
token country {
<name> \n
<destination>+
}
token destination {
\t <name> \s+ ':' \s+
<lat=.num> ',' <long=.num> \s+ ':' \s+
<sales=.integer> \n
}
token name { \w+ [ \s \w+ ]* }
token num { '-'? \d+ [\.\d+]? }
token integer { '-'? \d+ }
}
![Page 49: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/49.jpg)
Perl 6: For Little Tools and Large Applications
Now we can turn any file
in this format into a data
structure.
Easy to work with
structured data.
![Page 50: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/50.jpg)
Perl 6: For Little Tools and Large Applications
my $parsed = SalesExport.parsefile('dump.txt');
…
![Page 51: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/51.jpg)
Perl 6: For Little Tools and Large Applications
my $parsed = SalesExport.parsefile('dump.txt');
if $parsed {
…
}
else {
die "Parse error!";
}
![Page 52: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/52.jpg)
Perl 6: For Little Tools and Large Applications
my $parsed = SalesExport.parsefile('dump.txt');
if $parsed {
my @countries = @($parsed<country>);
…
}
else {
die "Parse error!";
}
![Page 53: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/53.jpg)
Perl 6: For Little Tools and Large Applications
my $parsed = SalesExport.parsefile('dump.txt');
if $parsed {
my @countries = @($parsed<country>);
my $top = @countries.max({
…
});
…
}
else {
die "Parse error!";
}
![Page 54: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/54.jpg)
Perl 6: For Little Tools and Large Applications
my $parsed = SalesExport.parsefile('dump.txt');
if $parsed {
my @countries = @($parsed<country>);
my $top = @countries.max({
[+]
});
…
}
else {
die "Parse error!";
}
![Page 55: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/55.jpg)
Perl 6: For Little Tools and Large Applications
my $parsed = SalesExport.parsefile('dump.txt');
if $parsed {
my @countries = @($parsed<country>);
my $top = @countries.max({
[+] .<destination>
});
…
}
else {
die "Parse error!";
}
![Page 56: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/56.jpg)
Perl 6: For Little Tools and Large Applications
my $parsed = SalesExport.parsefile('dump.txt');
if $parsed {
my @countries = @($parsed<country>);
my $top = @countries.max({
[+] .<destination>».<sales>
});
…
}
else {
die "Parse error!";
}
![Page 57: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/57.jpg)
Perl 6: For Little Tools and Large Applications
my $parsed = SalesExport.parsefile('dump.txt');
if $parsed {
my @countries = @($parsed<country>);
my $top = @countries.max({
[+] .<destination>».<sales>
});
say "Most popular today: $top<name>";
}
else {
die "Parse error!";
}
![Page 58: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/58.jpg)
Perl 6: For Little Tools and Large Applications
my $parsed = SalesExport.parsefile('dump.txt');
if $parsed {
my @countries = @($parsed<country>);
my $top = @countries.max({
[+] .<destination>».<sales>
});
say "Most popular today: $top<name>";
}
else {
die "Parse error!";
}
![Page 59: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/59.jpg)
Perl 6: For Little Tools and Large Applications
Grammars go with being a
glue language even
easier to get data into a
program.
Perl 6 also makes it easier
to interact with native
libraries.
![Page 60: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/60.jpg)
Perl 6: For Little Tools and Large Applications
use NativeCall;
…
With NativeCall module:
![Page 61: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/61.jpg)
Perl 6: For Little Tools and Large Applications
use NativeCall;
sub mysql_real_connect(
OpaquePointer $mysql_client, Str $host,
Str $user, Str $password, Str $database,
Int $port, Str $socket, Int $flag)
returns OpaquePointer
{ ... }
With NativeCall module:
1. Write a stub subroutine with a signature
![Page 62: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/62.jpg)
Perl 6: For Little Tools and Large Applications
use NativeCall;
sub mysql_real_connect(
OpaquePointer $mysql_client, Str $host,
Str $user, Str $password, Str $database,
Int $port, Str $socket, Int $flag)
returns OpaquePointer
is native('libmysqlclient‘)
{ ... }
With NativeCall module:
1. Write a stub subroutine with a signature
2. Mark it as coming from a native library
![Page 63: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/63.jpg)
Perl 6: For Little Tools and Large Applications
use NativeCall;
sub mysql_real_connect(
OpaquePointer $mysql_client, Str $host,
Str $user, Str $password, Str $database,
Int $port, Str $socket, Int $flag)
returns OpaquePointer
is native('libmysqlclient‘)
{ ... }
With NativeCall module:
1. Write a stub subroutine with a signature
2. Mark it as coming from a native library
3. Profit!
![Page 64: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/64.jpg)
Perl 6: For Little Tools and Large Applications
For the Large
Applications
![Page 65: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/65.jpg)
Perl 6: For Little Tools and Large Applications
If you've used Moose,
you will probably find
the Perl 6 object model
easy to start using.
Different syntax, but a
lot of the same
keywords and concepts.
![Page 66: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/66.jpg)
Perl 6: For Little Tools and Large Applications
class Beer {
has $!name;
method describe() {
say "I'm drinking $!name";
}
}
Creating and using a
class is quick and easy.
my $pint = Beer.new(name => 'Tuborg');
$pint.describe();
![Page 67: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/67.jpg)
Perl 6: For Little Tools and Large Applications
class Dog {
has $.name is rw;
has $.color;
}
Attributes are private;
declarative accessor syntax.
my $pet = Dog.new(
name => 'Spot', color => 'Black'
);
$pet.name = 'Fido'; # OK
$pet.color = 'White'; # Fails
![Page 68: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/68.jpg)
Perl 6: For Little Tools and Large Applications
Perl 6 supports (multiple)
inheritance.
However, multiple
inheritance has issues
(e.g. diamond problem),
and single inheritance
limits re-use.
![Page 69: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/69.jpg)
Perl 6: For Little Tools and Large Applications
As well as classes, the
Perl 6 object model
includes support for
roles.
![Page 70: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/70.jpg)
Perl 6: For Little Tools and Large Applications
A role can have attributes
and methods, but unlike a
class is not intended to be
used on its own.
Instead one or more roles
are composed into a class.
![Page 71: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/71.jpg)
Perl 6: For Little Tools and Large Applications
role Logging {
method log($message) {
my $fh = open('log', :a);
$fh.say($message);
$fh.close;
}
}
class MailSender does Logging {
…
}
![Page 72: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/72.jpg)
Perl 6: For Little Tools and Large Applications
Methods and attributes
are "copied" into the
class, as if they were
declared there.
If two roles try to supply a
method with the same
name, you get a compile
time error.
![Page 73: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/73.jpg)
Perl 6: For Little Tools and Large Applications
role Drinking {
method go-to-bar() { … }
}
role Gymnastics {
method go-to-bar() { … }
}
class DrunkGymnast {
does Gymnastics;
does Drinking;
}
![Page 74: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/74.jpg)
Perl 6: For Little Tools and Large Applications
Such conflicts can be
resolved by:
Writing a method in the class
that decides what to do
or
Having a proto method in the
class (which forces the two to
become make them multis)
![Page 75: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/75.jpg)
Perl 6: For Little Tools and Large Applications
role Drinking {
method go-to-bar() { … }
}
role Gymnastics {
method go-to-bar() { … }
}
class DrunkGymnast {
does Gymnastics;
does Drinking;
method go-to-bar() {
self.Gymnastics::go-to-bar();
}
}
![Page 76: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/76.jpg)
Perl 6: For Little Tools and Large Applications
Also provides…
Inheritance
Delegation
Constructors
Deferral to parents
Introspection
Meta-programming
![Page 77: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/77.jpg)
Perl 6: For Little Tools and Large Applications
Perl 6 allows you to add type
constraints to your variables,
parameters, attributes, etc.
Enforced at runtime at latest,
but a smart compiler may
complain at compile time if it
detects code that could
never possibly work
![Page 78: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/78.jpg)
Perl 6: For Little Tools and Large Applications
sub show_dist(Str $from, Str $to, Int $kms) {
say "From $from to $to is $kms km.";
}
show_dist('Oslo', 'Lund', 495);
show_dist(495, 'Oslo', 'Lund');
Typed Parameters
Can restrict a parameter to only
accept arguments of a certain type.
From Oslo to Lund is 495 km.
Nominal type check failed for parameter '$from'; expected Str
but got Int instead
in 'show_dist' at line 1:test.p6
in main program body at line 5:test.p6
![Page 79: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/79.jpg)
Perl 6: For Little Tools and Large Applications
Benefits Today
Type annotations allow you to
add more checks and balances
into your application, so you can
be sure nothing is going awry.
Also can serve as good
documentation.
![Page 80: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/80.jpg)
Perl 6: For Little Tools and Large Applications
Gradual Typing
The compiler will be able to
make use of type information to
emit more optimal code (a
current work in progress)
The compiler will be able to do
more checks for you at compile
time and flag up problems
![Page 81: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/81.jpg)
Perl 6: For Little Tools and Large Applications
No extra
type
information
provided
Fully
Statically
typed
program
The compiler lets you
choose how much
type information to
provide
and
tries to give you more
benefits as give it
more information to
work with
![Page 82: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/82.jpg)
Perl 6: For Little Tools and Large Applications
Conclusions
![Page 83: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/83.jpg)
Perl 6: For Little Tools and Large Applications
Perl 6 tries to be good
for little tools and for
large applications.
![Page 84: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/84.jpg)
Perl 6: For Little Tools and Large Applications
Not all features are
applicable to both.
![Page 85: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/85.jpg)
Perl 6: For Little Tools and Large Applications
Give developers a
choice where they
place themselves on
the prototype <->
production scale.
![Page 86: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/86.jpg)
Perl 6: For Little Tools and Large Applications
Provide migration
paths from "quick
hack" to "good code"
without switching
language.
![Page 87: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/87.jpg)
Perl 6: For Little Tools and Large Applications
Thank You!
![Page 88: Perl 6: For Little Tools and Large Applications](https://reader031.vdocuments.us/reader031/viewer/2022020704/61fb528d2e268c58cd5ccd8f/html5/thumbnails/88.jpg)
Perl 6: For Little Tools and Large Applications
Questions?