• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,233
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
7
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Pugs An implementation of Perl 6 Audrey Tang
  • 2.
  • 3. Pugs...
  • 4. Pugs... ≝ Perl 6 Compiler
  • 5. Pugs... ≝ Perl 6 Compiler ≝ Perl 6 Runtime
  • 6. Pugs... ≝ Perl 6 Compiler ≝ Perl 6 Runtime ≝ Perl 6 Test Suite
  • 7.
  • 8. Perl 6 Code
  • 9. Perl 6 Code ✓ 130+ Modules
  • 10. Perl 6 Code ✓ 130+ Modules ✓ 160+ Examples
  • 11. Perl 6 Code ✓ 130+ Modules ✓ 160+ Examples ✓ 18,000+ Unit Tests
  • 12. “Official Perl 6”
  • 13. “Official Perl 6” ✓ Defined by semantics, not by accidents of history
  • 14. “Official Perl 6” ✓ Defined by semantics, not by accidents of history ✓ Compatibility test suite (cf. JavaTest/TCK)
  • 15. Spec Test ✓
  • 16. Test Spec ✓
  • 17.
  • 18. Perl, circa 1995
  • 19. Perl, circa 1995 • use 5.000;
  • 20. Perl, circa 1995 • use 5.000; • require 'fastcwd.pl';
  • 21. Perl, circa 1995 • use 5.000; • require 'fastcwd.pl'; • require 'newgetopt.pl';
  • 22. Perl, circa 1995 • use 5.000; • require 'fastcwd.pl'; • require 'newgetopt.pl'; • require 'exceptions.pl';
  • 23. Perl, circa 2005
  • 24. Perl, circa 2005 • use v6-alpha;
  • 25. Perl, circa 2005 • use v6-alpha; • use perl5:DBI;
  • 26. Perl, circa 2005 • use v6-alpha; • use perl5:DBI; • use perl5:Encode <encode decode>;
  • 27. Perl, circa 2005 • use v6-alpha; • use perl5:DBI; • use perl5:Encode <encode decode>; • use perl5:Template;
  • 28. Perl, circa 2005 • use v6-alpha; • use perl5:DBI; • use perl5:Encode <encode decode>; • use perl5:Template; • # Implementation of "crypt" eval "crypt()" :lang<perl5>;
  • 29. Hybrid Runcore Pugs GHC Perl 5 Runtime Runtime Pugs.Eval Pugs::Runtime Pugs.Prim Pugs::Compiler Pugs.Types Pugs::Grammar
  • 30. Hybrid Runcore Pugs ⇚ Perl 5 GHC Perl 5 Runtime Runtime Pugs.Eval Pugs::Runtime Pugs.Prim Pugs::Compiler Pugs.Types Pugs::Grammar
  • 31. Hybrid Runcore Pugs ⇚ Perl 5 GHC Perl 5 ⇚ Haskell Runtime Runtime Pugs.Eval Pugs::Runtime Pugs.Prim Pugs::Compiler Pugs.Types Pugs::Grammar
  • 32. Hybrid Runcore Pugs ⇚ Perl 5 GHC Perl 5 ⇚ Haskell Runtime Runtime ⇚ C (.so/.dll) Pugs.Eval Pugs.Prim Pugs.Types Pugs::Runtime Pugs::Compiler Pugs::Grammar
  • 33.
  • 34. Pugs Intermediate Language
  • 35. Compilation Flow
  • 36. Backends Pugs Java Haskell Perl 5 Script
  • 37. Backends JVM? YARV? Pugs CLR? PyPy? Java Haskell Perl 5 Script
  • 38. Perl 5 Backend Tool Support CPAN, PAUSE Perldoc, Perl::Tidy ... Syntax v6.pm Pugs::Compiler::Perl6 ... Perl 5 Sugar Moose, Moose::Autobox ... Semantics Data::Bind, Class::MOP Pugs::Runtime, Pugs::Compiler::Rule ... Augmentation (XS) Infrastructure PadWalker, Devel::Caller Parse::Yapp autobox, re::override ... Module::Compile ... Core perl
  • 39. Perl 5 Backend ⇛ Augment P5VM Tool Support CPAN, PAUSE Perldoc, Perl::Tidy ... Syntax v6.pm Pugs::Compiler::Perl6 ... Perl 5 Sugar Moose, Moose::Autobox ... Semantics Data::Bind, Class::MOP Pugs::Runtime, Pugs::Compiler::Rule ... Augmentation (XS) Infrastructure PadWalker, Devel::Caller Parse::Yapp autobox, re::override ... Module::Compile ... Core perl
  • 40. Perl 5 Backend ⇛ Augment P5VM Tool Support CPAN, PAUSE Perldoc, Perl::Tidy ... Syntax v6.pm Pugs::Compiler::Perl6 ... ⇛ Deploy P6 as P5 Perl 5 Sugar Moose, Moose::Autobox ... Semantics Data::Bind, Class::MOP Pugs::Runtime, Pugs::Compiler::Rule ... Augmentation (XS) Infrastructure PadWalker, Devel::Caller Parse::Yapp autobox, re::override ... Module::Compile ... Core perl
  • 41. Perl 5 Backend ⇛ Augment P5VM Tool Support CPAN, PAUSE Perldoc, Perl::Tidy ... Syntax v6.pm Pugs::Compiler::Perl6 ... ⇛ Deploy P6 as P5 Perl 5 Sugar Moose, Moose::Autobox ... Semantics Data::Bind, Class::MOP Pugs::Runtime, Pugs::Compiler::Rule ... ⇛ v6.pm on CPAN Augmentation (XS) Infrastructure PadWalker, Devel::Caller Parse::Yapp autobox, re::override ... Module::Compile ... Core perl
  • 42. JavaScript Backend
  • 43. JavaScript Backend ⇛ Like GWT, Hop, Links...
  • 44. JavaScript Backend ⇛ Like GWT, Hop, Links... ⇛ Passes 90% of tests
  • 45. JavaScript Backend ⇛ Like GWT, Hop, Links... ⇛ Passes 90% of tests ⇛ Slow - Aim for JS2/Tamarin
  • 46.
  • 47. 6.0 Primitives ䷁
  • 48. 6.2 Functions ䷗
  • 49. 6.28 Objects ䷒
  • 50. 6.283 Grammars ䷊
  • 51. 6.2831 Types ䷡
  • 52. 6.28318 Macros ䷪
  • 53. 6.283185 Self Hosting ䷀
  • 54. 2π Perl 6!
  • 55.
  • 56. “Frivolous Toy interpreter” (as seen on Slashdot)
  • 57. “Frivolous Toy interpreter”
  • 58. “Frivolous Toy interpreter”
  • 59. “Toy interpreter”
  • 60. “Toy interpreter”
  • 61. “Toy”
  • 62. -Ofun
  • 63.
  • 64. Arrow length 15500+ commits 290+ committers Time
  • 65. Test Driven
  • 66. Test Driven ☺Bug report ➟ Test
  • 67. Test Driven ☺Bug report ➟ Test ☺Smoke Server
  • 68. Test Driven ☺Bug report ➟ Test ☺Smoke Server ☺:todo<unspecced>
  • 69. Anarchistic
  • 70. Anarchistic ☺10+ languages
  • 71. Anarchistic ☺10+ languages ☺30+ sub-projects
  • 72. Anarchistic ☺10+ languages ☺30+ sub-projects ☺Aggressive recruiting
  • 73. Patches Welcome !
  • 74. Patches Welcome !
  • 75. Commits Welcome!
  • 76.
  • 77. irc.freenode.net #perl6
  • 78. λ Camels
  • 79. λ Camels ✆ 200+ People
  • 80. λ Camels ✆ 200+ People ✆ 20+ Regulars
  • 81. λ Camels ✆ 200+ People ✆ 20+ Regulars ✆ TimToady++
  • 82. svnbot6
  • 83. evalbot6
  • 84. devbot6
  • 85. lambdabot
  • 86. IRC.pugscode.org
  • 87. Run.pugscode.org
  • 88. Dev.pugscode.org
  • 89. Invite.pugscode.org
  • 90. Smoke.pugscode.org
  • 91. Spec.pugscode.org
  • 92. Blog.pugscode.org
  • 93. Mailing Lists
  • 94. Mailing Lists ✆ perl6-users
  • 95. Mailing Lists ✆ perl6-users ✆ perl6-language
  • 96. Mailing Lists ✆ perl6-users ✆ perl6-language ✆ perl6-compiler
  • 97. Repositories
  • 98. Repositories http://svn.pugscode.org/pugs/
  • 99. Repositories http://svn.pugscode.org/pugs/ http://darcs.pugscode.org/pugs/
  • 100. Repositories http://svn.pugscode.org/pugs/ http://darcs.pugscode.org/pugs/ SVK
  • 101. Erdösing
  • 102. Erdösing 2006..*
  • 103. Hackathons
  • 104. Hackathons Taipei
  • 105. Hackathons Taipei Vienna
  • 106. Hackathons Taipei Vienna Toronto
  • 107. Hackathons Taipei Vienna Toronto Amsterdam
  • 108. Hackathons Taipei Vienna Toronto Amsterdam Echt
  • 109. Hackathons Taipei Vienna Toronto Amsterdam Echt Lismore
  • 110. Hackathons Taipei Vienna Toronto Amsterdam Echt Lismore Mt. Arbel
  • 111. Hackathons Taipei Vienna2 Vienna Toronto Amsterdam Echt Lismore Mt. Arbel
  • 112. Hackathons Taipei Vienna2 Vienna Tokyo Toronto Amsterdam Echt Lismore Mt. Arbel
  • 113. Hackathons Taipei Vienna2 Vienna Tokyo Toronto Redmond Amsterdam Echt Lismore Mt. Arbel
  • 114. Hackathons Taipei Vienna2 Vienna Tokyo Toronto Redmond Amsterdam Chicago Echt Lismore Mt. Arbel
  • 115. Hackathons Taipei Vienna2 Vienna Tokyo Toronto Redmond Amsterdam Chicago Echt Boston Lismore Mt. Arbel
  • 116. Hackathons Taipei Vienna2 Vienna Tokyo Toronto Redmond Amsterdam Chicago Echt Boston Lismore Portland Mt. Arbel
  • 117. Hackathons Taipei Vienna2 Vienna Tokyo Toronto Redmond Amsterdam Chicago Echt Boston Lismore Portland Mt. Arbel Sao Paulo
  • 118. Hackathons Taipei Vienna2 Vienna Tokyo Toronto Redmond Amsterdam Chicago Echt Boston Lismore Portland Mt. Arbel Sao Paulo Mountain View?
  • 119. Perl 6 Reconciling the Irreconcilable Audrey Tang
  • 120.
  • 121. Practical
  • 122.
  • 123. Abstractions ➥ Sexy
  • 124. Closures sub make_counter { my $start = shift; return sub { ++$start }; } my $from_ten = make_counter(10); my $from_three = make_counter(3); print $from_three->(); # 4 print $from_three->(); # 5 print $from_ten->(); # 11
  • 125. Staged Evaluation BEGIN { print "Compile-time"; eval $generated_code; print "Still in compiler"; } print "Normal runtime"; eval $more_generated_code;
  • 126. Runtime Typecasting my $piece = Pawn->new; bless $piece, Queen;
  • 127. S
  • 128. Shorthands ➥ Natural
  • 129. Contexts # Scalar vs. List context my $one = <STDIN>; # Read one line my @all = <STDIN>; # Read all lines # String vs. Numeric context print "Lines: @all" if @all < 10;
  • 130. Tied Variables tie my %search => 'Tie::Google'; print $search{'Perl Pugs'}[0]{URL}; # http://www.pugscode.org/
  • 131. Regular Expresisons # DeCSS s''$/=2048;while(<>){G=29;R=142;if((@a=unqT="C*",_)[20]&48){D=89;_=unqb24,qT,@ b=map{ord qB8,unqb8,qT,_^$a[--D]}@INC;s/...$/1$&/;Q=unqV,qb25,_;H=73;O=$b[4]<<9 |256|$b[3];Q=Q>>8^(P=(E=255)&(Q>>12^Q>>4^Q/8^Q))<<17,O=O>>8^(E&(F=(S=O>>14&7^O) ^S*8^S<<6))<<9,_=(map{U=_%16orE^=R^=110&(S=(unqT,"xbntdxbzx14d")[_/16%8]);E ^=(72,@z=(64,72,G^=12*(U-2?0:S&17)),H^=_%64?12:0,@z)[_%8]}(16..271))[_]^((D>>=8 )+=P+(~F&E))for@a[128..$#a]}print+qT,@a}';s/[D-HO-U_]/$$&/g;s/q/pack+/g;eval
  • 132. Best coding ➥ No coding
  • 133. CPAN
  • 134. CPAN 11 years
  • 135. CPAN 11 years 5500+ authors
  • 136. CPAN 11 years 5500+ authors 11000+ modules
  • 137. Services
  • 138. Services Package Management
  • 139. Services Package Management Rating & Discussion
  • 140. Services Package Management Rating & Discussion Smoke Testing
  • 141. Services Package Management Rating & Discussion Smoke Testing Issue Tracking
  • 142. Vocabulary ≩ Syntax
  • 143. “The Best thing happened to Perl”
  • 144. But...
  • 145. Perl 5 is not the best thing for CPAN
  • 146.
  • 147. Syntax Redundancy ☣
  • 148. • use v5;
  • 149. • use v5; • sub render {
  • 150. • use v5; • sub render { • my $self = shift;
  • 151. • use v5; • sub render { • my $self = shift; • my %opts = (x => 1, y => 1, z => 0, %{$_[0]});
  • 152. • use v5; • sub render { • my $self = shift; • my %opts = (x => 1, y => 1, z => 0, %{$_[0]}); • for my $item ( $self->filter(@{ $self->{items} }) ) {
  • 153. • use v5; • sub render { • my $self = shift; • my %opts = (x => 1, y => 1, z => 0, %{$_[0]}); • for my $item ( $self->filter(@{ $self->{items} }) ) { • print $item->draw({ x => $opts{x}, y => $opts{y}, z => $opts{z}, }), "n";
  • 154. • use v5; • sub render { • my $self = shift; • my %opts = (x => 1, y => 1, z => 0, %{$_[0]}); • for my $item ( $self->filter(@{ $self->{items} }) ) { • print $item->draw({ x => $opts{x}, y => $opts{y}, z => $opts{z}, }), "n"; • } }
  • 155. • use v6-alpha;
  • 156. • use v6-alpha; • method render ($x = 1, $y = 1, $z = 0) {
  • 157. • use v6-alpha; • method render ($x = 1, $y = 1, $z = 0) { • for @.filter(@.items) {
  • 158. • use v6-alpha; • method render ($x = 1, $y = 1, $z = 0) { • for @.filter(@.items) { • say .draw(:$x, :$y, :$z); } }
  • 159. Jenga Internals ☣
  • 160. Bug-for-bug compatibility ☣
  • 161. Best Practice takes discipline
  • 162. Best Practice should be Natural!
  • 163. 2000 RFCs
  • 164. 2001 Parrot
  • 165. 2002 Apocalypses
  • 166. 2003 Ponie (late, as in the late Arthur Dent)
  • 167. 2004 Synopses
  • 168. 2005 Pugs
  • 169. 2006 v6-alpha
  • 170. Reconcile the Irreconcilable
  • 171. Static Typing vs Dynamic Typing
  • 172. Types ☺
  • 173. Typing ☹
  • 174. Static (C++, OCaml...)
  • 175. Static (C++, OCaml...) Efficient
  • 176. Static (C++, OCaml...) Efficient Robust
  • 177. Static Dynamic (C++, OCaml...) (Python, Ruby, ...) Efficient Robust
  • 178. Static Dynamic (C++, OCaml...) (Python, Ruby, ...) Efficient Productive Robust
  • 179. Static Dynamic (C++, OCaml...) (Python, Ruby, ...) Efficient Productive Robust Flexible
  • 180. Gradual Typing with Annotations and Type Inference
  • 181. • use v5; • sub f { • sqrt($_[0]**2 + $_[1]**2); •} • my $five = f( 3, 4 );
  • 182. • use v6-alpha; • sub f { • sqrt(@_[0]**2 + @_[1]**2); •} • my $five = f( 3, 4 );
  • 183. •sub f (Num $x, Num $y) { • sqrt($x**2 + $y**2); •} •my Num $five = f( 3, 4 );
  • 184. • subset Positive of Num where { $_ > 0 }
  • 185. • subset Positive of Num where { $_ > 0 } • sub f ( Positive $x, Positive $y --> Positive where { $_ > ($x & $y) } ) {
  • 186. • subset Positive of Num where { $_ > 0 } • sub f ( Positive $x, Positive $y --> Positive where { $_ > ($x & $y) } ) { • sqrt($x ** 2 + $y ** 2); }
  • 187. • subset Positive of Num where { $_ > 0 } • sub f ( Positive $x, Positive $y --> Positive where { $_ > ($x & $y) } ) { • sqrt($x ** 2 + $y ** 2); } • my $five := f(3, 4); # inferred as Positive
  • 188. Domain Specific vs General Purpose
  • 189. DSL (SQL, Regex, ...)
  • 190. DSL (SQL, Regex, ...) Concise
  • 191. DSL (SQL, Regex, ...) Concise Expressive
  • 192. DSL GPL (SQL, Regex, ...) (Lisp, C, ...) Concise Expressive
  • 193. DSL GPL (SQL, Regex, ...) (Lisp, C, ...) Concise Versatile Expressive
  • 194. DSL GPL (SQL, Regex, ...) (Lisp, C, ...) Concise Versatile Expressive Reusable
  • 195. Extensible Compilation
  • 196. Macros
  • 197. Macros Compile-time evaluation
  • 198. Macros Compile-time evaluation All parts are swappable
  • 199. Macros Compile-time evaluation All parts are swappable Even the lexer!
  • 200. • macro circumfix:</* */> ($x) • is parsed /.*?/ • { '' } • • /* This is a C-style comment */ •
  • 201. • sub postfix:<!> ($x) { • [*] 1..$x •} • • say 10!; # 3628800
  • 202. • macro GREETING () { • # A late-bound macro • q:code(:COMPILING){ "Hello, $s" }; •} • my $s = "world"; • say GREETING; # Hello, world
  • 203. Lazy Evaluation vs Eager Evaluation
  • 204. Lazy (Haskell, Unix pipes)
  • 205. Lazy (Haskell, Unix pipes) Modular
  • 206. Lazy (Haskell, Unix pipes) Modular Reasonable
  • 207. Lazy Eager (Haskell, Unix pipes) (everybody else) Modular Reasonable
  • 208. Lazy Eager (Haskell, Unix pipes) (everybody else) Modular Direct Reasonable
  • 209. Lazy Eager (Haskell, Unix pipes) (everybody else) Modular Direct Reasonable Predictable
  • 210. Return-type Polymorphism with Laziness Annotations
  • 211. •# "cat" for =<> { .say }
  • 212. •# "cat" for =<> { .say } •# "cat", together with line numbers for each(1..*; =<>) { say "Line $^num: $^text"; }
  • 213. •# Lists are lazy by default
  • 214. • # Lists are lazy by default • my @fib := (
  • 215. • # Lists are lazy by default • my @fib := ( • 0, 1,
  • 216. • # Lists are lazy by default • my @fib := ( • 0, 1, • each(@fib; @fib[1..*]).map(&infix:<+>) );
  • 217. • # Lists are lazy by default • my @fib := ( • 0, 1, • each(@fib; @fib[1..*]).map(&infix:<+>) ); • say "The first ten numbers are: @fib[^10]";
  • 218. •# Items are eager values. However...
  • 219. • # Items are eager values. However... • my $ignored = lazy { 10 ** (10 * 10) };
  • 220. • # Items are eager values. However... • my $ignored = lazy { 10 ** (10 * 10) }; • my $unused = lazy { say 1..$ignored };
  • 221. • # Items are eager values. However... • my $ignored = lazy { 10 ** (10 * 10) }; • my $unused = lazy { say 1..$ignored }; • say "Hello, world!";
  • 222. Classes vs Prototypes
  • 223. Classes (Java, Smalltalk, ...)
  • 224. Classes (Java, Smalltalk, ...) Typeful
  • 225. Classes (Java, Smalltalk, ...) Typeful Disciplined
  • 226. Classes Prototypes (Java, Smalltalk, ...) (JavaScript, Lua, ...) Typeful Disciplined
  • 227. Classes Prototypes (Java, Smalltalk, ...) (JavaScript, Lua, ...) Typeful Adaptive Disciplined
  • 228. Classes Prototypes (Java, Smalltalk, ...) (JavaScript, Lua, ...) Typeful Adaptive Disciplined Convenient
  • 229. Meta-Object Protocol
  • 230. • class Dog is Mammal does Companion {
  • 231. • class Dog is Mammal does Companion { • my $.count where 0..100;
  • 232. • class Dog is Mammal does Companion { • my $.count where 0..100; • has $!brain;
  • 233. • class Dog is Mammal does Companion { • my $.count where 0..100; • has $!brain; • has &.vocalize = &say; has $.name is rw = "Fido";
  • 234. • class Dog is Mammal does Companion { • my $.count where 0..100; • has $!brain; • has &.vocalize = &say; has $.name is rw = "Fido"; • has $.fur handles Groomable; has $.tail handles <wag hang>;
  • 235. • class Dog is Mammal does Companion { • my $.count where 0..100; • has $!brain; • has &.vocalize = &say; has $.name is rw = "Fido"; • has $.fur handles Groomable; has $.tail handles <wag hang>; • method companion handles s/^owner_// { ... } }
  • 236. • my Dog $fido .= new;
  • 237. • my Dog $fido .= new; • $fido.HOW; # the meta object for Dog
  • 238. • my Dog $fido .= new; • $fido.HOW; # the meta object for Dog • $fido.WHAT; # the Dog prototype object
  • 239. • my Dog $fido .= new; • $fido.HOW; # the meta object for Dog • $fido.WHAT; # the Dog prototype object • $fido.WHICH; # $fido’s Object ID
  • 240. • my Dog $fido .= new; • $fido.HOW; # the meta object for Dog • $fido.WHAT; # the Dog prototype object • $fido.WHICH; # $fido’s Object ID • Dog.isa(Dog); $fido.isa(Dog);
  • 241. • $fido.HOW.add_method( 'bark', method () { $.vocalize('Woof!') } );
  • 242. • $fido.HOW.add_method( 'bark', method () { $.vocalize('Woof!') } ); • Dog.can('bark'); $fido.can('bark');
  • 243. Threads vs Processes
  • 244. Threads (Implicit sharing)
  • 245. Threads (Implicit sharing) Intuitive
  • 246. Threads (Implicit sharing) Intuitive Parallelizable
  • 247. Threads Processes (Implicit sharing) (Explicit sharing) Intuitive Parallelizable
  • 248. Threads Processes (Implicit sharing) (Explicit sharing) Intuitive Deterministic Parallelizable
  • 249. Threads Processes (Implicit sharing) (Explicit sharing) Intuitive Deterministic Parallelizable Manageable
  • 250. Concurrency ☺☺☺
  • 251. Locking ☹☹☹
  • 252. • async { $x.withdraw(3); $y.deposit(3); }
  • 253. • async { $x.withdraw(3); ☣ Race Condition ☣ $y.deposit(3); }
  • 254. • async { $x.lock; $y.lock;
  • 255. • async { $x.lock; $y.lock; • $x.withdraw(3); $y.deposit(3); }
  • 256. • async { • async { $x.lock; $y.lock; $y.lock; $x.lock; • $x.withdraw(3); } $y.deposit(3); }
  • 257. ☣ Deadlock ☣ • async { • async { $x.lock; $y.lock; $y.lock; $x.lock; • $x.withdraw(3); } $y.deposit(3); }
  • 258. Software Transactional Memory
  • 259. • async { • contend { # begin transaction • $x.withdraw(3); $y.deposit(3); • } # commit or rollback • }
  • 260. •# Retry with "defer" method withdraw ($n) { defer if $.balance < $n; $.balance -= $n; }
  • 261. •# Retry with "defer" method withdraw ($n) { defer if $.balance < $n; $.balance -= $n; } • # Choice with "maybe" sub transfer ($x1, $x2, $y) { maybe { $x1.withdraw(3) } maybe { $x2.withdraw(3) } $y.deposit(3); }
  • 262. •# Retry with "defer" method withdraw ($n) { defer if $.balance < $n; $.balance -= $n; } • # Choice with "maybe" sub transfer ($x1, $x2, $y) { maybe { $x1.withdraw(3) } maybe { $x2.withdraw(3) } $y.deposit(3); } • # Composable with nested "maybe" contend { maybe { transfer($x1, $x2, $y) } maybe { transfer($x3, $x4, $y) } }
  • 263. SIMD vs MIMD
  • 264. SIMD (APL, Fortran)
  • 265. SIMD (APL, Fortran) Simple
  • 266. SIMD (APL, Fortran) Simple Scalable
  • 267. SIMD MIMD (APL, Fortran) (everybody else) Simple Scalable
  • 268. SIMD MIMD (APL, Fortran) (everybody else) Simple Richer types Scalable
  • 269. SIMD MIMD (APL, Fortran) (everybody else) Simple Richer types Scalable Familiar flow
  • 270. •# Hyper Operator (SSE/GPU friendly) [1, 1, 2, 3, 5] »+« [1, 2, 3, 5, 8];
  • 271. • # Hyper Operator (SSE/GPU friendly) [1, 1, 2, 3, 5] »+« [1, 2, 3, 5, 8]; • # === [2, 3, 5, 8, 13]
  • 272. •# Recursive Visits -« [[1, 2], 3];
  • 273. • # Recursive Visits -« [[1, 2], 3]; • # === [[-1, -2], -3]
  • 274. •# Hyper Methods [1, 4, 9, 16]».sqrt;
  • 275. •# Hyper Methods [1, 4, 9, 16]».sqrt; •# === [1, 2, 3, 4]
  • 276. • % time pugs -e '(1..100000)>>.sqrt' real 9.387s user 9.219s
  • 277. • % time pugs -e '(1..100000)>>.sqrt' real 9.387s user 9.219s • % time env GHCRTS=-N2 pugs -e '(1..100000)>>.sqrt' real 5.807s user 6.959s
  • 278. •# Junctions sub is_prime (Int $n --> Bool) { $n % all(2 .. $n.sqrt+1); }
  • 279. •# Junctions sub is_prime (Int $n --> Bool) { $n % all(2 .. $n.sqrt+1); } • sub has_twin_prime (Int $n --> Bool) { is_prime($n & ($n ± 2)); }
  • 280. •# Junctions sub is_prime (Int $n --> Bool) { $n % all(2 .. $n.sqrt+1); } • sub has_twin_prime (Int $n --> Bool) { is_prime($n & ($n ± 2)); } • sub infix:<±> ($x, $y) { ($x + $y) | ($x - $y); }
  • 281. •# Junctions sub is_prime (Int $n --> Bool) { $n % all(2 .. $n.sqrt+1); } • sub has_twin_prime (Int $n --> Bool) { is_prime($n & ($n ± 2)); } • sub infix:<±> ($x, $y) { ($x + $y) | ($x - $y); } •
  • 282. My Language vs Your Language
  • 283. Perl 6
  • 284. Perl 6 Better
  • 285. Perl 6 Better Better
  • 286. Perl 6 Others Better Better
  • 287. Perl 6 Others Better Better Better
  • 288. Perl 6 Others Better Better Better Better
  • 289. •use jsan:DOM; •use perl5:DBI; •use haskell:Numeric; •use your_language:FavouriteModule;
  • 290. JVM? YARV? Pugs CLR? PyPy? Java Haskell Perl 5 Script
  • 291.
  • 292. When will Perl 6 be released?
  • 293. By Christmas!
  • 294. When Perl 6 arrives, every day will be like Christmas! ❆
  • 295. Thank you! ☺