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 talk - sneak peak

370 views

Published on

  • Be the first to comment

  • Be the first to like this

Perl 6 talk - sneak peak

  1. 1. Perl 6 An Apocalypse 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 starts monthly releases 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 starts monthly releases 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; enum Color <red green blue>; Matt Follett matt.follett@gmail.com
  19. 19. Classes • declare:  attributes  accessors/mutators  delegation • inherit from multiple classes • define methods • consume roles Matt Follett matt.follett@gmail.com
  20. 20. 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
  21. 21. 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
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. 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
  26. 26. class Manager is Employee { has @.employees is rw; has Employee $.assistant is ro handles 'work_on'; } Matt Follett matt.follett@gmail.com
  27. 27. class Manager is Employee { has @.employees is rw; has Employee $.assistant is ro handles 'work_on'; } Matt Follett matt.follett@gmail.com
  28. 28. class Manager is Employee { has @.employees is rw; has Employee $.assistant is ro handles 'work_on'; } Matt Follett matt.follett@gmail.com
  29. 29. 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
  30. 30. role Ergonaut { method evaluate { say 'This ' ~ <chair desk>.pick ~ ' ' ~ <is isn't>.pick ~ ' ergonomic'; } } Matt Follett matt.follett@gmail.com
  31. 31. • 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
  32. 32. Sub Signatures • positional and named parameters • Constrain method invocation on:  number of variables  types  where clauses • or, don’t constrain at all Matt Follett matt.follett@gmail.com
  33. 33. Plain old Positional sub exp($base, $exponent) { return $base ** $exponent } exp( 2, 5) # 32 Matt Follett matt.follett@gmail.com
  34. 34. Named Parameters sub exp($base, $exponent) { return $base ** $exponent } exp( exponent => 5, base => 2 ) Matt Follett matt.follett@gmail.com
  35. 35. Strictly Named Parameters sub draw_circle( $canvas, :$x, :$y, :$radius, :$color ) draw_circle( $canvas2, 3, 2, 3, 442266 ); Matt Follett matt.follett@gmail.com
  36. 36. Strictly Named Parameters sub draw_circle( $canvas, :$x, :$y, :$radius, :$color ) draw_circle( $canvas2, 3, 2, 3, 442266 ); Matt Follett matt.follett@gmail.com
  37. 37. 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
  38. 38. Constraining Inputs sub is_prime( $input ) Matt Follett matt.follett@gmail.com
  39. 39. Constraining Inputs sub is_prime( Int $input ) Matt Follett matt.follett@gmail.com
  40. 40. Constraining Inputs sub is_prime( Int $input where { $^x % 2 }) Matt Follett matt.follett@gmail.com
  41. 41. Methods as Objects Matt Follett matt.follett@gmail.com
  42. 42. 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
  43. 43. 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
  44. 44. 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
  45. 45. 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
  46. 46. Multi-Method Dispatch • Dispatch to a method based on any number of parameters • also supports functional style pattern matching Matt Follett matt.follett@gmail.com
  47. 47. λ Functions • Just as powerful as named functions • Multiple ways to create • A building block of the language Matt Follett matt.follett@gmail.com
  48. 48. Basic Form my $add_two_nums = sub (Real $x, Real $y) {$x+$y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  49. 49. Basic Form my $add_two_nums = sub (Real $x, Real $y) {$x+$y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  50. 50. With Twigils my $add_two_nums = sub {$^x+$^y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  51. 51. With Twigils my $add_two_nums = sub {$^x+$^y}; $add_two_nums(11,12); Matt Follett matt.follett@gmail.com
  52. 52. 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
  53. 53. λ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
  54. 54. λ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
  55. 55. λ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
  56. 56. λ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
  57. 57. λs are Everywhere • All blocks are λs • All blocks benefit for 1..10 -> $x { say $x } Matt Follett matt.follett@gmail.com
  58. 58. λs are Everywhere • All blocks are λs • All blocks benefit for 1..10 { say $^x } Matt Follett matt.follett@gmail.com
  59. 59. λs are Everywhere • All blocks are λs • All blocks benefit for 1..10 -> $x, $y { say "$x, $y" } Matt Follett matt.follett@gmail.com
  60. 60. λs are Everywhere • All blocks are λs • All blocks benefit for 1..11 -> $x, $y='' { say "$x, $y" } Matt Follett matt.follett@gmail.com
  61. 61. 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
  62. 62. Operators Matt Follett matt.follett@gmail.com
  63. 63. 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
  64. 64. Range Operator Matt Follett matt.follett@gmail.com
  65. 65. Range Operator • Creates lazily evaluated lists: my @N := 0...* Matt Follett matt.follett@gmail.com
  66. 66. Range Operator • Creates lazily evaluated lists: my @N := 0...* Matt Follett matt.follett@gmail.com
  67. 67. 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
  68. 68. 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
  69. 69. 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
  70. 70. 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
  71. 71. 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
  72. 72. 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
  73. 73. 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
  74. 74. 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
  75. 75. 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
  76. 76. 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
  77. 77. 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
  78. 78. 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
  79. 79. 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
  80. 80. 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
  81. 81. 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
  82. 82. 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
  83. 83. 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
  84. 84. 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
  85. 85. 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
  86. 86. 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
  87. 87. 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
  88. 88. 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
  89. 89. 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
  90. 90. 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
  91. 91. 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
  92. 92. 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
  93. 93. 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
  94. 94. 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
  95. 95. 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
  96. 96. 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
  97. 97. 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
  98. 98. 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
  99. 99. 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
  100. 100. Custom Operator Example sub infix:<⊕> ($a, $b) is tighter(&infix:<*>) { sqrt($a**2+$b**2); }; say 2 ⊕ 4; Matt Follett matt.follett@gmail.com
  101. 101. Custom Operator Example sub infix:<⊕> ($a, $b) is tighter(&infix:<*>) { sqrt($a**2+$b**2); }; say 2 ⊕ 4; Matt Follett matt.follett@gmail.com
  102. 102. 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
  103. 103. 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
  104. 104. [ui] username=Matt Follett email=matt.follett@gmail.com [extensions] #best extension ever! hg.cowlog= Matt Follett matt.follett@gmail.com
  105. 105. 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

×