Perl 6

                                                An Apocalypse




The Camelia image is copyright 2009 and trademar...
Instance of Perl 6




          • Pugs - Perl 6 on Haskell
          • Niecza - Perl 6 on the CLR
          • Sprixel - P...
Instance of Perl 6




          • Pugs - Perl 6 on Haskell
          • Niecza - Perl 6 on the CLR
          • Sprixel - P...
Modules




Matt Follett matt.follett@gmail.com
The Backstory

• Perl 6 announced at Perl Conference in 2000
• Immediate RFCs
• First apocalypse on April 2, 2001
• Twelft...
More Backstory

• Parrot April Fool’s Joke 2001
• First commit to Parrot on August 29, 2001
• Audrey Tang publicly release...
Recent History

• Parrot starts monthly releases in January 2007
• Parrot starts major releases on a yearly cycle in 2010
...
Recent History

• Parrot starts monthly releases in January 2007
• Parrot starts major releases on a yearly cycle in 2010
...
Rakudo *



          • a useful, usable, "early adopter" distribution of Perl
            6
                nota 1.0
   ...
Feedback = Improvements




Matt Follett matt.follett@gmail.com
                             http://gil.di.uminho.pt/users...
The Basics




          • Variables are prepended with a sigil to indicate
            their basic type (scalar, array, h...
my @array = 1,2,3;
say(@array[0])

my ($fruit, $jp) = 'apples', JSON.new();
$jp.parse($something_from_somewhere);

my %dic...
my @array = 1,2,3;
say(@array[0])

my ($fruit, $jp) = 'apples', JSON.new();
$jp.parse($something_from_somewhere);

my %dic...
my @array = 1,2,3;
say(@array[0])

my ($fruit, $jp) = 'apples', JSON.new();
$jp.parse($something_from_somewhere);

my %dic...
my @array = 1,2,3;
say(@array[0])

my ($fruit, $jp) = 'apples', JSON.new();
$jp.parse($something_from_somewhere);

my %dic...
Optional Typing



      • All variables in Perl 6 have a type, declared like:



               my Str $name = 'Matt Foll...
Types




Matt Follett matt.follett@gmail.com
Custom Type & Enums




            subset Odd of Int where * % 2;
            my Odd $number = 41;

            enum Colo...
Custom Type & Enums




            subset Odd of Int where * % 2;
            my Odd $number = 41;

            enum Colo...
Custom Type & Enums




            subset Odd of Int where * % 2;
            my Odd $number = 41;

            enum Colo...
Custom Type & Enums




            subset Odd of Int where * % 2;
            my Odd $number = 41;

            enum Colo...
Custom Type & Enums




            subset Odd of Int where * % 2;
            my Odd $number = 41;

            enum Colo...
Custom Type & Enums




            subset Odd of Int where * % 2;
            my Odd $number = 41;

            enum Colo...
Custom Type & Enums




            subset Odd of Int where * % 2;
            my Odd $number = 41;

            enum Colo...
Classes

• declare:
     attributes
     accessors/mutators
     delegation

• inherit from multiple classes
• define m...
class Employee {
 has Str $.name is rw
      = <Alice Bob Charles Dorothy>.pick;
 has Rat $!salary;
 has Rat $!money = 0;
...
class Employee {
 has Str $.name is rw
      = <Alice Bob Charles Dorothy>.pick;
 has Rat $!salary;
 has Rat $!money = 0;
...
class Employee {
 has Str $.name is rw
      = <Alice Bob Charles Dorothy>.pick;
 has Rat $!salary;
 has Rat $!money = 0;
...
class Employee {
 has Str $.name is rw
      = <Alice Bob Charles Dorothy>.pick;
 has Rat $!salary;
 has Rat $!money = 0;
...
class Employee {
 has Str $.name is rw
      = <Alice Bob Charles Dorothy>.pick;
 has Rat $!salary;
 has Rat $!money = 0;
...
class Employee {
 has Str $.name is rw
      = <Alice Bob Charles Dorothy>.pick;
 has Rat $!salary;
 has Rat $!money = 0;
...
class Manager is Employee
{
    has @.employees is rw;
    has Employee $.assistant
                 is ro handles 'work_o...
class Manager is Employee
{
    has @.employees is rw;
    has Employee $.assistant
                 is ro handles 'work_o...
class Manager is Employee
{
    has @.employees is rw;
    has Employee $.assistant
                 is ro handles 'work_o...
Roles

• Classes consume roles
• Roles provide:
     new methods for a set of tasks (like mix-ins)
     modifications fo...
role Ergonaut
 {
     method evaluate {
         say 'This ' ~ <chair desk>.pick
           ~ ' ' ~ <is isn't>.pick
      ...
• Compile Time

       class EmployeeErgonaut
             is Employee does Ergonaut
       {}

       • Mixin Style
     ...
Sub Signatures

• positional and named parameters
• Constrain method invocation on:
     number        of variables
    ...
Plain old Positional




         sub exp($base, $exponent) {
             return $base ** $exponent
         }

         ...
Named Parameters




         sub exp($base, $exponent) {
              return $base ** $exponent
         }
         exp(...
Strictly Named Parameters




sub draw_circle( $canvas, :$x, :$y,
                 :$radius, :$color )


draw_circle( $can...
Strictly Named Parameters




sub draw_circle( $canvas, :$x, :$y,
                 :$radius, :$color )


draw_circle( $can...
Strictly Named Parameters




sub draw_circle( $canvas, :$x, :$y,
                 :$radius, :$color )


draw_circle( $can...
Constraining Inputs




              sub is_prime(           $input )




Matt Follett matt.follett@gmail.com
Constraining Inputs




              sub is_prime( Int $input )




Matt Follett matt.follett@gmail.com
Constraining Inputs




              sub is_prime( Int $input
                              where * % 2)




Matt Follett...
Methods as Objects




Matt Follett matt.follett@gmail.com
Methods as Objects

• Curry methods



   sub multiply_numbers(Num $x, Num $y) {
       $x * $y;
   }

   my $mult_by_four...
Methods as Objects

• Curry methods
• Wrap around methods


   sub multiply_numbers(Num $x, Num $y) {
       $x * $y;
   }...
Methods as Objects

• Curry methods
• Wrap around methods


   sub multiply_numbers(Num $x, Num $y) {
       $x * $y;
   }...
Methods as Objects

• Curry methods
• Wrap around methods
• Determine method arity

   sub multiply_numbers(Num $x, Num $y...
Functional Style Pattern Matching

• Perl subs and methods can do pattern matching in their
  parameter list
• Example:

m...
Functional Style Pattern Matching

• Perl subs and methods can do pattern matching in their
  parameter list
• Example:

m...
Functional Style Pattern Matching

• Perl subs and methods can do pattern matching in their
  parameter list
• Example:

m...
Functional Style Pattern Matching

• Perl subs and methods can do pattern matching in their
  parameter list
• Example:

m...
Functional Style Pattern Matching

• Perl subs and methods can do pattern matching in their
  parameter list
• Example:

m...
Functional Style Pattern Matching

• Perl subs and methods can do pattern matching in their
  parameter list
• Example:

m...
Functional Style Pattern Matching

• Perl subs and methods can do pattern matching in their
  parameter list
• Example:

m...
Functional Style Pattern Matching

• Perl subs and methods can do pattern matching in their
  parameter list
• Example:

m...
λ Functions

• Just as powerful as named functions
• Multiple ways to create
• A building block of the language




Matt F...
Basic Form




my $add_two_nums =
   sub (Real $x, Real $y) {$x+$y};

$add_two_nums(11,12);




Matt Follett matt.follett@...
Basic Form




my $add_two_nums =
   sub (Real $x, Real $y) {$x+$y};

$add_two_nums(11,12);




Matt Follett matt.follett@...
With Twigils




my $add_two_nums = sub {$^x+$^y};

$add_two_nums(11,12);




Matt Follett matt.follett@gmail.com
With Twigils




my $add_two_nums = sub {$^x+$^y};

$add_two_nums(11,12);




Matt Follett matt.follett@gmail.com
With Twigils




my $add_two_nums = sub {$^x+$^y};

$add_two_nums(11,12);


my $add_two_nums=sub($x,$y){$x+$y}

Matt Folle...
λs are Everywhere




          • All blocks are λs


my $add_two_nums = sub {$^x+$^y};

$add_two_nums(11,12);




Matt Fo...
λs are Everywhere




          • All blocks are λs


my $add_two_nums = sub {$^x+$^y};

$add_two_nums(11,12);




Matt Fo...
λs are Everywhere




          • All blocks are λs


my $add_two_nums = sub {$^x+$^y};

$add_two_nums(11,12);

my $add_tw...
λs are Everywhere




          • All blocks are λs


my $add_two_nums = sub {$^x+$^y};

$add_two_nums(11,12);

my $add_tw...
λs are Everywhere




         • All blocks are λs
         • All blocks benefit




                     for 1..10 -> $x
...
λs are Everywhere




         • All blocks are λs
         • All blocks benefit




                     for 1..10
      ...
λs are Everywhere




         • All blocks are λs
         • All blocks benefit




                     for 1..10 -> $x,...
λs are Everywhere




         • All blocks are λs
         • All blocks benefit




                     for 1..11 -> $x,...
Simplest Form

• Uses the Whatever term
• Included in a unary or binary operation
• Statement returns a λ
• Examples:
  my...
Operators




Matt Follett matt.follett@gmail.com
Operators

• New Operators
• Better range operator
• Chaining Binary Operators
• New Types of Operators
     Meta Operato...
Range Operator




Matt Follett matt.follett@gmail.com
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*




Matt Follett matt.follett@gmail.com
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*




Matt Follett matt.follett@gmail.com
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Range Operator

• Creates lazily evaluated lists:
    my @N := 0...*
• Basic form is very smart, versatile:

    my @negat...
Meta Operators

• Meta operators are operators who’s operand is another
  operator
• Simplify writing operators
• Provide ...
Meta Operators Simplifying Operators

• Assignment operators
        A op= B
     example:

   @names .= sort
• Negated r...
Reduction Meta Operator

• Written as []
• Takes a list and reduces it to a scalar value
• uses a specified infix operator...
Reduction Meta Operator

• Written as []
• Takes a list and reduces it to a scalar value
• uses a specified infix operator...
Reduction Meta Operator

• Written as []
• Takes a list and reduces it to a scalar value
• uses a specified infix operator...
Reduction Meta Operator

• Written as []
• Takes a list and reduces it to a scalar value
• uses a specified infix operator...
Hyper Meta Operator

• Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘
• Performs the operations as fast as possible
• Can...
Hyper Meta Operator

• Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘
• Performs the operations as fast as possible
• Can...
Hyper Meta Operator

• Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘
• Performs the operations as fast as possible
• Can...
Hyper Meta Operator

• Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘
• Performs the operations as fast as possible
• Can...
Hyper Meta Operator

• Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘
• Performs the operations as fast as possible
• Can...
Cross Meta Operator

• Written as ‘X’
• Crosses two arrays, making tuples of each cell then applying
  the operator to the...
Cross Meta Operator

• Written as ‘X’
• Crosses two arrays, making tuples of each cell then applying
  the operator to the...
Cross Meta Operator

• Written as ‘X’
• Crosses two arrays, making tuples of each cell then applying
  the operator to the...
Cross Meta Operator

• Written as ‘X’
• Crosses two arrays, making tuples of each cell then applying
  the operator to the...
Cross Meta Operator

• Written as ‘X’
• Crosses two arrays, making tuples of each cell then applying
  the operator to the...
Junctive Operators

• A variable can be any of some number of values via ‘|’
• A variable can be all of some number of val...
Junctive Operators

• A variable can be any of some number of values via ‘|’
• A variable can be all of some number of val...
Junctive Operators

• A variable can be any of some number of values via ‘|’
• A variable can be all of some number of val...
Junctive Operators

• A variable can be any of some number of values via ‘|’
• A variable can be all of some number of val...
Junctive Operators

• A variable can be any of some number of values via ‘|’
• A variable can be all of some number of val...
Junctive Operators

• A variable can be any of some number of values via ‘|’
• A variable can be all of some number of val...
Custom Operators

• Any unicode string
• Define precedence
     ‘is tighter’ - higher precedence than the given operator
...
Custom Operator Example




 sub infix:<⊕> ($a, $b) is tighter(&infix:<*>)
 {
             sqrt($a**2+$b**2);
 };

 say 2 ...
Custom Operator Example




 sub infix:<⊕> ($a, $b) is tighter(&infix:<*>)
 {
             sqrt($a**2+$b**2);
 };

 say 2 ...
Grammars

• Composed of rules and tokens
• Reusable through inheritance
• Defined like classes or modules
• starts from th...
grammar Mercurial::rc {
 rule TOP {^<line>*$};
 rule line {<header>|<assignment>|<comment>};
    rule header {'[' ~ ']' <h...
[ui]
                             username=Matt Follett
                             email=matt.follett@gmail.com

       ...
Where to go for more

• Try Rakudo: http://try.rakudo.org
• Using Perl 6: http://github.com/perl6/book/downloads
• Get Rak...
Upcoming SlideShare
Loading in...5
×

Perl 6 talk

3,163

Published on

This is the Perl 6 talk that I gave at Strange Loop 2010 on Thursday, October 14th.

The talk was designed for people who knew little to no Perl 6 and possibly little to no Perl 5.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,163
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
36
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Perl 6 talk

  1. 1. Perl 6 An Apocalypse The Camelia image is copyright 2009 and trademarked by Larry Wall Matt Follett matt.follett@gmail.com
  2. 2. Instance of Perl 6 • Pugs - Perl 6 on Haskell • Niecza - Perl 6 on the CLR • Sprixel - Perl 6 in JavaScript • Elf, Mildew • Perlito (MiniPerl6) - JVM, Go, Perl 5, JS, Lisp • YAPSI - Perl 6 in Perl 6 • Rakudo - Perl 6 on Parrot Matt Follett matt.follett@gmail.com
  3. 3. Instance of Perl 6 • Pugs - Perl 6 on Haskell • Niecza - Perl 6 on the CLR • Sprixel - Perl 6 in JavaScript • Elf, Mildew • Perlito (MiniPerl6) - JVM, Go, Perl 5, JS, Lisp • YAPSI - Perl 6 in Perl 6 • Rakudo - Perl 6 on Parrot Matt Follett matt.follett@gmail.com
  4. 4. Modules Matt Follett matt.follett@gmail.com
  5. 5. The Backstory • Perl 6 announced at Perl Conference in 2000 • Immediate RFCs • First apocalypse on April 2, 2001 • Twelfth apocalypse April 13, 2004 Matt Follett matt.follett@gmail.com http://www.perlfoundation.org/perl6/index.cgi?timeline
  6. 6. More Backstory • Parrot April Fool’s Joke 2001 • First commit to Parrot on August 29, 2001 • Audrey Tang publicly releases Pugs in February of 2005 Matt Follett matt.follett@gmail.com
  7. 7. Recent History • Parrot starts monthly releases in January 2007 • Parrot starts major releases on a yearly cycle in 2010 • Rakudo * monthly releases start in July 2010 Matt Follett matt.follett@gmail.com
  8. 8. Recent History • Parrot starts monthly releases in January 2007 • Parrot starts major releases on a yearly cycle in 2010 • Rakudo * monthly releases start in July 2010 Matt Follett matt.follett@gmail.com
  9. 9. Rakudo * • a useful, usable, "early adopter" distribution of Perl 6  nota 1.0  compile yourself • Includes modules for XML, JSON, YAML, database interfaces, etc • includes neutro • Helps get feedback to the Rakudo team Matt Follett matt.follett@gmail.com
  10. 10. Feedback = Improvements Matt Follett matt.follett@gmail.com http://gil.di.uminho.pt/users/smash/rakudo-bench.html
  11. 11. The Basics • Variables are prepended with a sigil to indicate their basic type (scalar, array, hash) • These sigils are invariant • Variables declared with ‘my’ are lexically scoped • Perl 6 autoboxes Matt Follett matt.follett@gmail.com
  12. 12. my @array = 1,2,3; say(@array[0]) my ($fruit, $jp) = 'apples', JSON.new(); $jp.parse($something_from_somewhere); my %dictionary = apples => 2, pears => 3; say("I have %dictionary{$fruit} $fruit"); Matt Follett matt.follett@gmail.com
  13. 13. my @array = 1,2,3; say(@array[0]) my ($fruit, $jp) = 'apples', JSON.new(); $jp.parse($something_from_somewhere); my %dictionary = apples => 2, pears => 3; say("I have %dictionary{$fruit} $fruit"); Matt Follett matt.follett@gmail.com
  14. 14. my @array = 1,2,3; say(@array[0]) my ($fruit, $jp) = 'apples', JSON.new(); $jp.parse($something_from_somewhere); my %dictionary = apples => 2, pears => 3; say("I have %dictionary{$fruit} $fruit"); Matt Follett matt.follett@gmail.com
  15. 15. my @array = 1,2,3; say(@array[0]) my ($fruit, $jp) = 'apples', JSON.new(); $jp.parse($something_from_somewhere); my %dictionary = apples => 2, pears => 3; say("I have %dictionary{$fruit} $fruit"); Matt Follett matt.follett@gmail.com
  16. 16. Optional Typing • All variables in Perl 6 have a type, declared like: my Str $name = 'Matt Follett'; $name = 'Matthew Follett'; $name = 4; # asplode • If a type isn’t declared the type is Any my $foo = 11; say('$foo is an '~ $foo.WHAT); # Any Matt Follett matt.follett@gmail.com
  17. 17. Types Matt Follett matt.follett@gmail.com
  18. 18. Custom Type & Enums subset Odd of Int where * % 2; my Odd $number = 41; enum Color <red green blue>; my Color $color = red; say $color == red; # true (1) say $color; # 0 say $color.key; # 'red' Matt Follett matt.follett@gmail.com
  19. 19. Custom Type & Enums subset Odd of Int where * % 2; my Odd $number = 41; enum Color <red green blue>; my Color $color = red; say $color == red; # true (1) say $color; # 0 say $color.key; # 'red' Matt Follett matt.follett@gmail.com
  20. 20. Custom Type & Enums subset Odd of Int where * % 2; my Odd $number = 41; enum Color <red green blue>; my Color $color = red; say $color == red; # true (1) say $color; # 0 say $color.key; # 'red' Matt Follett matt.follett@gmail.com
  21. 21. Custom Type & Enums subset Odd of Int where * % 2; my Odd $number = 41; enum Color <red green blue>; my Color $color = red; say $color == red; # true (1) say $color; # 0 say $color.key; # 'red' Matt Follett matt.follett@gmail.com
  22. 22. Custom Type & Enums subset Odd of Int where * % 2; my Odd $number = 41; enum Color <red green blue>; my Color $color = red; say $color == red; # true (1) say $color; # 0 say $color.key; # 'red' Matt Follett matt.follett@gmail.com
  23. 23. Custom Type & Enums subset Odd of Int where * % 2; my Odd $number = 41; enum Color <red green blue>; my Color $color = red; say $color == red; # true (1) say $color; # 0 say $color.key; # 'red' Matt Follett matt.follett@gmail.com
  24. 24. Custom Type & Enums subset Odd of Int where * % 2; my Odd $number = 41; enum Color <red green blue>; my Color $color = red; say $color == red; # true (1) say $color; # 0 say $color.key; # 'red' Matt Follett matt.follett@gmail.com
  25. 25. Classes • declare:  attributes  accessors/mutators  delegation • inherit from multiple classes • define methods • consume roles Matt Follett matt.follett@gmail.com
  26. 26. class Employee { has Str $.name is rw = <Alice Bob Charles Dorothy>.pick; has Rat $!salary; has Rat $!money = 0; method work_on( $project ) { say "$.name is working on $project." } method pay() { $!money += $!salary } } Matt Follett matt.follett@gmail.com
  27. 27. class Employee { has Str $.name is rw = <Alice Bob Charles Dorothy>.pick; has Rat $!salary; has Rat $!money = 0; method work_on( $project ) { say "$.name is working on $project." } method pay() { $!money += $!salary } } Matt Follett matt.follett@gmail.com
  28. 28. class Employee { has Str $.name is rw = <Alice Bob Charles Dorothy>.pick; has Rat $!salary; has Rat $!money = 0; method work_on( $project ) { say "$.name is working on $project." } method pay() { $!money += $!salary } } Matt Follett matt.follett@gmail.com
  29. 29. class Employee { has Str $.name is rw = <Alice Bob Charles Dorothy>.pick; has Rat $!salary; has Rat $!money = 0; method work_on( $project ) { say "$.name is working on $project." } method pay() { $!money += $!salary } } Matt Follett matt.follett@gmail.com
  30. 30. class Employee { has Str $.name is rw = <Alice Bob Charles Dorothy>.pick; has Rat $!salary; has Rat $!money = 0; method work_on( $project ) { say "$.name is working on $project." } method pay() { $!money += $!salary } } Matt Follett matt.follett@gmail.com
  31. 31. class Employee { has Str $.name is rw = <Alice Bob Charles Dorothy>.pick; has Rat $!salary; has Rat $!money = 0; method work_on( $project ) { say "$.name is working on $project." } method pay() { $!money += $!salary } } Matt Follett matt.follett@gmail.com
  32. 32. class Manager is Employee { has @.employees is rw; has Employee $.assistant is ro handles 'work_on'; } Matt Follett matt.follett@gmail.com
  33. 33. class Manager is Employee { has @.employees is rw; has Employee $.assistant is ro handles 'work_on'; } Matt Follett matt.follett@gmail.com
  34. 34. class Manager is Employee { has @.employees is rw; has Employee $.assistant is ro handles 'work_on'; } Matt Follett matt.follett@gmail.com
  35. 35. Roles • Classes consume roles • Roles provide:  new methods for a set of tasks (like mix-ins)  modifications for existing methods • Roles can be consumed at compile time or run time Matt Follett matt.follett@gmail.com
  36. 36. role Ergonaut { method evaluate { say 'This ' ~ <chair desk>.pick ~ ' ' ~ <is isn't>.pick ~ ' ergonomic'; } } Matt Follett matt.follett@gmail.com
  37. 37. • Compile Time class EmployeeErgonaut is Employee does Ergonaut {} • Mixin Style my Employee $e1 = Employee.new( name => 'Matt', title => 'software developer', salary => 1_000_000 ); $e1 does Ergonaut; Matt Follett matt.follett@gmail.com
  38. 38. Sub Signatures • positional and named parameters • Constrain method invocation on:  number of variables  types  where clauses  pattern • or, don’t constrain at all Matt Follett matt.follett@gmail.com
  39. 39. Plain old Positional sub exp($base, $exponent) { return $base ** $exponent } exp( 2, 5) # 32 Matt Follett matt.follett@gmail.com
  40. 40. Named Parameters sub exp($base, $exponent) { return $base ** $exponent } exp( exponent => 5, base => 2 ) Matt Follett matt.follett@gmail.com
  41. 41. Strictly Named Parameters sub draw_circle( $canvas, :$x, :$y, :$radius, :$color ) draw_circle( $canvas2, 3, 2, 3, 442266 ); Matt Follett matt.follett@gmail.com
  42. 42. Strictly Named Parameters sub draw_circle( $canvas, :$x, :$y, :$radius, :$color ) draw_circle( $canvas2, 3, 2, 3, 442266 ); Matt Follett matt.follett@gmail.com
  43. 43. Strictly Named Parameters sub draw_circle( $canvas, :$x, :$y, :$radius, :$color ) draw_circle( $canvas2, x => 3, y => 2, radius => 3, color => ”#442266” ); Matt Follett matt.follett@gmail.com
  44. 44. Constraining Inputs sub is_prime( $input ) Matt Follett matt.follett@gmail.com
  45. 45. Constraining Inputs sub is_prime( Int $input ) Matt Follett matt.follett@gmail.com
  46. 46. Constraining Inputs sub is_prime( Int $input where * % 2) Matt Follett matt.follett@gmail.com
  47. 47. Methods as Objects Matt Follett matt.follett@gmail.com
  48. 48. Methods as Objects • Curry methods sub multiply_numbers(Num $x, Num $y) { $x * $y; } my $mult_by_four = &multiply_numbers.assuming(4); Matt Follett matt.follett@gmail.com
  49. 49. Methods as Objects • Curry methods • Wrap around methods sub multiply_numbers(Num $x, Num $y) { $x * $y; } my $mult_and_add = &multiply_numbers.wrap({$^x+$^y +callwith($^x, $^y)}); Matt Follett matt.follett@gmail.com
  50. 50. Methods as Objects • Curry methods • Wrap around methods sub multiply_numbers(Num $x, Num $y) { $x * $y; } my $mult_and_add = &multiply_numbers.wrap({$^x+$^y +callwith($^x, $^y)}); Matt Follett matt.follett@gmail.com
  51. 51. Methods as Objects • Curry methods • Wrap around methods • Determine method arity sub multiply_numbers(Num $x, Num $y) { $x * $y; } my $arity = &multiply_numbers.arity() Matt Follett matt.follett@gmail.com
  52. 52. Functional Style Pattern Matching • Perl subs and methods can do pattern matching in their parameter list • Example: multi divide($num, 0) { die 'floating point exception'; } multi divide($num, $denom) { return $num/$denom } divide(11, 0); # dies! (would return Inf) divide(12, 2); # 6 Matt Follett matt.follett@gmail.com
  53. 53. Functional Style Pattern Matching • Perl subs and methods can do pattern matching in their parameter list • Example: multi divide($num, 0) { die 'floating point exception'; } multi divide($num, $denom) { return $num/$denom } divide(11, 0); # dies! (would return Inf) divide(12, 2); # 6 Matt Follett matt.follett@gmail.com
  54. 54. Functional Style Pattern Matching • Perl subs and methods can do pattern matching in their parameter list • Example: multi divide($num, 0) { die 'floating point exception'; } multi divide($num, $denom) { return $num/$denom } divide(11, 0); # dies! (would return Inf) divide(12, 2); # 6 Matt Follett matt.follett@gmail.com
  55. 55. Functional Style Pattern Matching • Perl subs and methods can do pattern matching in their parameter list • Example: multi divide($num, 0) { die 'floating point exception'; } multi divide($num, $denom) { return $num/$denom } divide(11, 0); # dies! (would return Inf) divide(12, 2); # 6 Matt Follett matt.follett@gmail.com
  56. 56. Functional Style Pattern Matching • Perl subs and methods can do pattern matching in their parameter list • Example: multi divide($num, 0) { die 'floating point exception'; } multi divide($num, $denom) { return $num/$denom } divide(11, 0); # dies! (would return Inf) divide(12, 2); # 6 Matt Follett matt.follett@gmail.com
  57. 57. Functional Style Pattern Matching • Perl subs and methods can do pattern matching in their parameter list • Example: multi divide($num, 0) { die 'floating point exception'; } multi divide($num, $denom) { return $num/$denom } divide(11, 0); # dies! (would return Inf) divide(12, 2); # 6 Matt Follett matt.follett@gmail.com
  58. 58. Functional Style Pattern Matching • Perl subs and methods can do pattern matching in their parameter list • Example: multi divide($num, 0) { die 'floating point exception'; } multi divide($num, $denom) { return $num/$denom } divide(11, 0); # dies! (would return Inf) divide(12, 2); # 6 Matt Follett matt.follett@gmail.com
  59. 59. Functional Style Pattern Matching • Perl subs and methods can do pattern matching in their parameter list • Example: multi divide($num, 0) { die 'floating point exception'; } multi divide($num, $denom) { return $num/$denom } divide(11, 0); # dies! (would return Inf) divide(12, 2); # 6 Matt Follett matt.follett@gmail.com
  60. 60. λ Functions • Just as powerful as named functions • Multiple ways to create • A building block of the language Matt Follett matt.follett@gmail.com
  61. 61. Basic Form my $add_two_nums = sub (Real $x, Real $y) {$x+$y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  62. 62. Basic Form my $add_two_nums = sub (Real $x, Real $y) {$x+$y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  63. 63. With Twigils my $add_two_nums = sub {$^x+$^y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  64. 64. With Twigils my $add_two_nums = sub {$^x+$^y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  65. 65. With Twigils my $add_two_nums = sub {$^x+$^y}; $add_two_nums(11,12); my $add_two_nums=sub($x,$y){$x+$y} Matt Follett matt.follett@gmail.com
  66. 66. λs are Everywhere • All blocks are λs my $add_two_nums = sub {$^x+$^y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  67. 67. λs are Everywhere • All blocks are λs my $add_two_nums = sub {$^x+$^y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  68. 68. λs are Everywhere • All blocks are λs my $add_two_nums = sub {$^x+$^y}; $add_two_nums(11,12); my $add_two_nums = ->$x,$y{$x+$y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  69. 69. λs are Everywhere • All blocks are λs my $add_two_nums = sub {$^x+$^y}; $add_two_nums(11,12); my $add_two_nums = ->$x,$y{$x+$y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  70. 70. λs are Everywhere • All blocks are λs • All blocks benefit for 1..10 -> $x { say $x } Matt Follett matt.follett@gmail.com
  71. 71. λs are Everywhere • All blocks are λs • All blocks benefit for 1..10 { say $^x } Matt Follett matt.follett@gmail.com
  72. 72. λs are Everywhere • All blocks are λs • All blocks benefit for 1..10 -> $x, $y { say "$x, $y" } Matt Follett matt.follett@gmail.com
  73. 73. λs are Everywhere • All blocks are λs • All blocks benefit for 1..11 -> $x, $y='' { say "$x, $y" } Matt Follett matt.follett@gmail.com
  74. 74. Simplest Form • Uses the Whatever term • Included in a unary or binary operation • Statement returns a λ • Examples: my $add_two = * + 2; $add_two(3); # 5 my $invoke_method = *.sort; $invoke_method(@some_array); Matt Follett matt.follett@gmail.com
  75. 75. Operators Matt Follett matt.follett@gmail.com
  76. 76. Operators • New Operators • Better range operator • Chaining Binary Operators • New Types of Operators  Meta Operators  Junctive Operators • More powerful custom operators Matt Follett matt.follett@gmail.com
  77. 77. Range Operator Matt Follett matt.follett@gmail.com
  78. 78. Range Operator • Creates lazily evaluated lists: my @N := 0...* Matt Follett matt.follett@gmail.com
  79. 79. Range Operator • Creates lazily evaluated lists: my @N := 0...* Matt Follett matt.follett@gmail.com
  80. 80. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' Matt Follett matt.follett@gmail.com
  81. 81. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' Matt Follett matt.follett@gmail.com
  82. 82. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' Matt Follett matt.follett@gmail.com
  83. 83. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' Matt Follett matt.follett@gmail.com
  84. 84. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' Matt Follett matt.follett@gmail.com
  85. 85. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' • Advanced form takes λs for iterator and ending condition: my @fib := 0,1,*+*...* my @double_letters := 'a'...* eq 'zz' Matt Follett matt.follett@gmail.com
  86. 86. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' • Advanced form takes λs for iterator and ending condition: my @fib := 0,1,*+*...* my @double_letters := 'a'...* eq 'zz' Matt Follett matt.follett@gmail.com
  87. 87. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' • Advanced form takes λs for iterator and ending condition: my @fib := 0,1,*+*...* my @double_letters := 'a'...* eq 'zz' Matt Follett matt.follett@gmail.com
  88. 88. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' • Advanced form takes λs for iterator and ending condition: my @fib := 0,1,*+*...* my @double_letters := 'a'...* eq 'zz' Matt Follett matt.follett@gmail.com
  89. 89. Range Operator • Creates lazily evaluated lists: my @N := 0...* • Basic form is very smart, versatile: my @negatives := -1,-2...* my @multiples_of_two := 0,2,4...* my @powers_of_two := 0,2,4,8...* my @letters = 'a'...'z' • Advanced form takes λs for iterator and ending condition: my @fib := 0,1,*+*...* my @double_letters := 'a'...* eq 'zz' Matt Follett matt.follett@gmail.com
  90. 90. Meta Operators • Meta operators are operators who’s operand is another operator • Simplify writing operators • Provide new strengths  meta reduction operator  cross meta operator  hyperoperator Matt Follett matt.follett@gmail.com
  91. 91. Meta Operators Simplifying Operators • Assignment operators A op= B  example: @names .= sort • Negated relational operators  infix relational operators can all be negated by prepending ‘!’  example: $foo !< 11 Matt Follett matt.follett@gmail.com
  92. 92. Reduction Meta Operator • Written as [] • Takes a list and reduces it to a scalar value • uses a specified infix operator • like foldl, foldr but respects associativity • Examples: [*] 1..$x [**] 1..$x # 1 ** ( 2 ** ( 3 **…$x ) ) [<] @list or [>] @list Matt Follett matt.follett@gmail.com
  93. 93. Reduction Meta Operator • Written as [] • Takes a list and reduces it to a scalar value • uses a specified infix operator • like foldl, foldr but respects associativity • Examples: [*] 1..$x [**] 1..$x # 1 ** ( 2 ** ( 3 **…$x ) ) [<] @list or [>] @list Matt Follett matt.follett@gmail.com
  94. 94. Reduction Meta Operator • Written as [] • Takes a list and reduces it to a scalar value • uses a specified infix operator • like foldl, foldr but respects associativity • Examples: [*] 1..$x [**] 1..$x # 1 ** ( 2 ** ( 3 **…$x ) ) [<] @list or [>] @list Matt Follett matt.follett@gmail.com
  95. 95. Reduction Meta Operator • Written as [] • Takes a list and reduces it to a scalar value • uses a specified infix operator • like foldl, foldr but respects associativity • Examples: [*] 1..$x [**] 1..$x # 1 ** ( 2 ** ( 3 **…$x ) ) [<] @list or [>] @list Matt Follett matt.follett@gmail.com
  96. 96. Hyper Meta Operator • Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘ • Performs the operations as fast as possible • Can parallelize these operations • Does not guarantee order of results • Examples: (1..10) >>+<< (21..30); my @nums_squared = @nums >>**>> 2; my @hellos = "Hello, " <<~<< <Christian John Michael Eleanor Chris>; @hellos>>.say; Matt Follett matt.follett@gmail.com
  97. 97. Hyper Meta Operator • Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘ • Performs the operations as fast as possible • Can parallelize these operations • Does not guarantee order of results • Examples: (1..10) >>+<< (21..30); my @nums_squared = @nums >>**>> 2; my @hellos = "Hello, " <<~<< <Christian John Michael Eleanor Chris>; @hellos>>.say; Matt Follett matt.follett@gmail.com
  98. 98. Hyper Meta Operator • Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘ • Performs the operations as fast as possible • Can parallelize these operations • Does not guarantee order of results • Examples: (1..10) >>+<< (21..30); my @nums_squared = @nums >>**>> 2; my @hellos = "Hello, " <<~<< <Christian John Michael Eleanor Chris>; @hellos>>.say; Matt Follett matt.follett@gmail.com
  99. 99. Hyper Meta Operator • Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘ • Performs the operations as fast as possible • Can parallelize these operations • Does not guarantee order of results • Examples: (1..10) >>+<< (21..30); my @nums_squared = @nums >>**>> 2; my @hellos = "Hello, " <<~<< <Christian John Michael Eleanor Chris>; @hellos>>.say; Matt Follett matt.follett@gmail.com
  100. 100. Hyper Meta Operator • Written as Unicode ‘»’, ‘«‘ or ASCII ‘>>’, ‘<<‘ • Performs the operations as fast as possible • Can parallelize these operations • Does not guarantee order of results • Examples: (1..10) >>+<< (21..30); my @nums_squared = @nums >>**>> 2; my @hellos = "Hello, " <<~<< <Christian John Michael Eleanor Chris>; @hellos>>.say; Matt Follett matt.follett@gmail.com
  101. 101. Cross Meta Operator • Written as ‘X’ • Crosses two arrays, making tuples of each cell then applying the operator to them • examples: (1,2) X* (3,4); Matt Follett matt.follett@gmail.com
  102. 102. Cross Meta Operator • Written as ‘X’ • Crosses two arrays, making tuples of each cell then applying the operator to them • examples: (1,2) X* (3,4);#((1,3),(1,4)(2,3),(2,4)) Matt Follett matt.follett@gmail.com
  103. 103. Cross Meta Operator • Written as ‘X’ • Crosses two arrays, making tuples of each cell then applying the operator to them • examples: (1,2) X* (3,4);#((1*3),(1*4)(2*3),(2*4)) Matt Follett matt.follett@gmail.com
  104. 104. Cross Meta Operator • Written as ‘X’ • Crosses two arrays, making tuples of each cell then applying the operator to them • examples: (1,2) X* (3,4);#(3,4,6,8) Matt Follett matt.follett@gmail.com
  105. 105. Cross Meta Operator • Written as ‘X’ • Crosses two arrays, making tuples of each cell then applying the operator to them • examples: (1,2) X* (3,4);#(3,4,6,8) < > X~ ('A',2..10,'J','Q','K'); Matt Follett matt.follett@gmail.com
  106. 106. Junctive Operators • A variable can be any of some number of values via ‘|’ • A variable can be all of some number of values via ‘&’ my $superposition = 4 | 5 | 6; $superposition += 1; # 5|6|7 6 ~~ $superposition; #true 9 ~~ $superposition; #false my $qualifications = *.can('sort') & *.can('push') & *.can('pop'); @array ~~ $qualifications; # true $scalar ~~ $qualifications; # false Matt Follett matt.follett@gmail.com
  107. 107. Junctive Operators • A variable can be any of some number of values via ‘|’ • A variable can be all of some number of values via ‘&’ my $superposition = 4 | 5 | 6; $superposition += 1; # 5|6|7 6 ~~ $superposition; #true 9 ~~ $superposition; #false my $qualifications = *.can('sort') & *.can('push') & *.can('pop'); @array ~~ $qualifications; # true $scalar ~~ $qualifications; # false Matt Follett matt.follett@gmail.com
  108. 108. Junctive Operators • A variable can be any of some number of values via ‘|’ • A variable can be all of some number of values via ‘&’ my $superposition = 4 | 5 | 6; $superposition += 1; # 5|6|7 6 ~~ $superposition; #true 9 ~~ $superposition; #false my $qualifications = *.can('sort') & *.can('push') & *.can('pop'); @array ~~ $qualifications; # true $scalar ~~ $qualifications; # false Matt Follett matt.follett@gmail.com
  109. 109. Junctive Operators • A variable can be any of some number of values via ‘|’ • A variable can be all of some number of values via ‘&’ my $superposition = 4 | 5 | 6; $superposition += 1; # 5|6|7 6 ~~ $superposition; #true 9 ~~ $superposition; #false my $qualifications = *.can('sort') & *.can('push') & *.can('pop'); @array ~~ $qualifications; # true $scalar ~~ $qualifications; # false Matt Follett matt.follett@gmail.com
  110. 110. Junctive Operators • A variable can be any of some number of values via ‘|’ • A variable can be all of some number of values via ‘&’ my $superposition = 4 | 5 | 6; $superposition += 1; # 5|6|7 6 ~~ $superposition; #true 9 ~~ $superposition; #false my $qualifications = *.can('sort') & *.can('push') & *.can('pop'); @array ~~ $qualifications; # true $scalar ~~ $qualifications; # false Matt Follett matt.follett@gmail.com
  111. 111. Junctive Operators • A variable can be any of some number of values via ‘|’ • A variable can be all of some number of values via ‘&’ my $superposition = 4 | 5 | 6; $superposition += 1; # 5|6|7 6 ~~ $superposition; #true 9 ~~ $superposition; #false my $qualifications = *.can('sort') & *.can('push') & *.can('pop'); @array ~~ $qualifications; # true $scalar ~~ $qualifications; # false Matt Follett matt.follett@gmail.com
  112. 112. Custom Operators • Any unicode string • Define precedence  ‘is tighter’ - higher precedence than the given operator  ‘is looser’ - lower precedence  ‘is equiv’ - same precedence • Many types  infix  postfix  prefix  circumfix  postcircumfix Matt Follett matt.follett@gmail.com
  113. 113. Custom Operator Example sub infix:<⊕> ($a, $b) is tighter(&infix:<*>) { sqrt($a**2+$b**2); }; say 2 ⊕ 4; Matt Follett matt.follett@gmail.com
  114. 114. Custom Operator Example sub infix:<⊕> ($a, $b) is tighter(&infix:<*>) { sqrt($a**2+$b**2); }; say 2 ⊕ 4; Matt Follett matt.follett@gmail.com
  115. 115. Grammars • Composed of rules and tokens • Reusable through inheritance • Defined like classes or modules • starts from the TOP rule Matt Follett matt.follett@gmail.com
  116. 116. grammar Mercurial::rc { rule TOP {^<line>*$}; rule line {<header>|<assignment>|<comment>}; rule header {'[' ~ ']' <header_name> }; rule assignment {<variable>'='<value>}; rule comment { '#' <message> }; token header_name {w<-[]]>+}; token variable {<-[=]>+}; token value {.*}; token message {.*}; } Matt Follett matt.follett@gmail.com
  117. 117. [ui] username=Matt Follett email=matt.follett@gmail.com [extensions] #best extension ever! hg.cowlog= Matt Follett matt.follett@gmail.com
  118. 118. Where to go for more • Try Rakudo: http://try.rakudo.org • Using Perl 6: http://github.com/perl6/book/downloads • Get Rakudo: http://rakudo.org/how-to-get-rakudo • The official Perl 6 site: http://www.perl6.org • Perl 6 synopses: http://perlcabal.org/syn/ • Planet Perl 6: http://planetsix.perl.org/ • Rosetta Code: http://www.rosettacode.org • My posts: http://mfollett.com/tag/perl6 Matt Follett matt.follett@gmail.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×