Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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,854 views

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
  • DOWNLOAD THE BOOK INTO AVAILABLE FORMAT (New Update) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://urlzs.com/UABbn } ......................................................................................................................... Download Full EPUB Ebook here { https://urlzs.com/UABbn } ......................................................................................................................... Download Full doc Ebook here { https://urlzs.com/UABbn } ......................................................................................................................... Download PDF EBOOK here { https://urlzs.com/UABbn } ......................................................................................................................... Download EPUB Ebook here { https://urlzs.com/UABbn } ......................................................................................................................... Download doc Ebook here { https://urlzs.com/UABbn } ......................................................................................................................... ......................................................................................................................... ................................................................................................................................... eBook is an electronic version of a traditional print book THE can be read by using a personal computer or by using an eBook reader. (An eBook reader can be a software application for use on a computer such as Microsoft's free Reader application, or a book-sized computer THE is used solely as a reading device such as Nuvomedia's Rocket eBook.) Users can purchase an eBook on diskette or CD, but the most popular method of getting an eBook is to purchase a downloadable file of the eBook (or other reading material) from a Web site (such as Barnes and Noble) to be read from the user's computer or reading device. Generally, an eBook can be downloaded in five minutes or less ......................................................................................................................... .............. Browse by Genre Available eBOOK .............................................................................................................................. Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, CookBOOK, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult, Crime, EBOOK, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, ......................................................................................................................... ......................................................................................................................... .....BEST SELLER FOR EBOOK RECOMMEND............................................................. ......................................................................................................................... Blowout: Corrupted Democracy, Rogue State Russia, and the Richest, Most Destructive Industry on Earth,-- The Ride of a Lifetime: Lessons Learned from 15 Years as CEO of the Walt Disney Company,-- Call Sign Chaos: Learning to Lead,-- StrengthsFinder 2.0,-- Stillness Is the Key,-- She Said: Breaking the Sexual Harassment Story THE Helped Ignite a Movement,-- Atomic Habits: An Easy &amp; Proven Way to Build Good Habits &amp; Break Bad Ones,-- Everything Is Figureoutable,-- What It Takes: Lessons in the Pursuit of Excellence,-- Rich Dad Poor Dad: What the Rich Teach Their Kids About Money THE the Poor and Middle Class Do Not!,-- The Total Money Makeover: Classic Edition: A Proven Plan for Financial Fitness,-- Shut Up and Listen!: Hard Business Truths THE Will Help You Succeed, ......................................................................................................................... .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (2019 Update) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://soo.gd/irt2 } ......................................................................................................................... Download Full EPUB Ebook here { https://soo.gd/irt2 } ......................................................................................................................... Download Full doc Ebook here { https://soo.gd/irt2 } ......................................................................................................................... Download PDF EBOOK here { https://soo.gd/irt2 } ......................................................................................................................... Download EPUB Ebook here { https://soo.gd/irt2 } ......................................................................................................................... Download doc Ebook here { https://soo.gd/irt2 } ......................................................................................................................... ......................................................................................................................... ................................................................................................................................... eBook is an electronic version of a traditional print book THIS can be read by using a personal computer or by using an eBook reader. (An eBook reader can be a software application for use on a computer such as Microsoft's free Reader application, or a book-sized computer THIS is used solely as a reading device such as Nuvomedia's Rocket eBook.) Users can purchase an eBook on diskette or CD, but the most popular method of getting an eBook is to purchase a downloadable file of the eBook (or other reading material) from a Web site (such as Barnes and Noble) to be read from the user's computer or reading device. Generally, an eBook can be downloaded in five minutes or less ......................................................................................................................... .............. Browse by Genre Available eBooks .............................................................................................................................. Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, ......................................................................................................................... ......................................................................................................................... .....BEST SELLER FOR EBOOK RECOMMEND............................................................. ......................................................................................................................... Blowout: Corrupted Democracy, Rogue State Russia, and the Richest, Most Destructive Industry on Earth,-- The Ride of a Lifetime: Lessons Learned from 15 Years as CEO of the Walt Disney Company,-- Call Sign Chaos: Learning to Lead,-- StrengthsFinder 2.0,-- Stillness Is the Key,-- She Said: Breaking the Sexual Harassment Story THIS Helped Ignite a Movement,-- Atomic Habits: An Easy &amp; Proven Way to Build Good Habits &amp; Break Bad Ones,-- Everything Is Figureoutable,-- What It Takes: Lessons in the Pursuit of Excellence,-- Rich Dad Poor Dad: What the Rich Teach Their Kids About Money THIS the Poor and Middle Class Do Not!,-- The Total Money Makeover: Classic Edition: A Proven Plan for Financial Fitness,-- Shut Up and Listen!: Hard Business Truths THIS Will Help You Succeed, ......................................................................................................................... .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ♥♥♥ http://bit.ly/2Qu6Caa ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ❶❶❶ http://bit.ly/2Qu6Caa ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

×