‣
quot;Subroutines are
 special cases of ... coroutines.quot;
                   --- Donald Knuth
say quot;startquot;;
                 sub say_hello {
say_hello(10);
                   my $n = shift;
                   ...
‣
my $c = Fiber>new(
$c‐>resume;
                 sub{               
                                    
                 ...
my $c = Fiber>new(
$c‐>resume;
                        sub{               
                                           
   ...
my $c = Fiber>new(
$c‐>resume;
                 sub{               
                                    
                 ...
‣
‣
‣
‣




‣
f = Fiber.new do # 
  n = 0
  loop do
    Fiber.yield(n)
    n += 1
  end
end

5.times do
 p f.resume # 
end
f = Fiber.new do # 
  n = 0
  loop do
    Fiber.yield(n)
    n += 1
  end
end

5.times do
 p f.resume # 
end
‣


‣


‣
use Fiber;
my $f = Fiber‐>new(
  sub{                            
    say 'hello';                  
                     ...
use Fiber;
my $f = Fiber‐>new(
  sub{                            
    say 'hello';                  
                     ...
$f‐>resume;                       
                                  
say 'coroutine';                  
                 ...
use Fiber;
                           my $f = Fiber‐>new(
                             sub{                 
             ...
y $f = Fiber‐>new(sub{
    my $s = SpaceShip‐>new;
    do { $s‐>move_up;    Fiber‐>yield } for (1..100);
    do { $s‐>move...
‣


‣
use Fiber;

my $factorial = Fiber‐>new(sub{
    my $n   = 1;
    my $val = 1;
    while (1) {
        $val = $val * $n++;
...
1


2       3
my $state1, $state2, $state3;               
                                            
                                ...
‣



‣
my $c = Fiber>new(
$c‐>resume;
                 sub{               
                                    
                 ...
‣
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Perlで学ぶコルーチン
Upcoming SlideShare
Loading in …5
×

Perlで学ぶコルーチン

5,517 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,517
On SlideShare
0
From Embeds
0
Number of Embeds
857
Actions
Shares
0
Downloads
24
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Perlで学ぶコルーチン

  1. 1. ‣
  2. 2. quot;Subroutines are special cases of ... coroutines.quot; --- Donald Knuth
  3. 3. say quot;startquot;; sub say_hello { say_hello(10);   my $n = shift;   for (1..$n) {     say 'hello';   } return; } say quot;endquot;;
  4. 4.
  5. 5. my $c = Fiber>new( $c‐>resume;  sub{                    say 'hello!';          Fiber‐>yield;           say 'happy'; $c‐>resume;   say 'perl';             Fiber‐>yield;            say 'coding'; $c‐>resume;   say 'world!';          } );   
  6. 6. my $c = Fiber>new( $c‐>resume;  sub{                    say 'hello!';          Fiber‐>yield;           say 'happy'; hello happy $c‐>resume;   say 'perl';           perl coding   Fiber‐>yield;         say 'coding'; world    $c‐>resume;   say 'world!';          } );   
  7. 7. my $c = Fiber>new( $c‐>resume;  sub{                    say 'hello!';          Fiber‐>yield;           say 'happy'; $c‐>resume;   say 'perl';             Fiber‐>yield;            say 'coding'; $c‐>resume;   say 'world!';          } );   
  8. 8. ‣ ‣ ‣
  9. 9. ‣ ‣
  10. 10. f = Fiber.new do #    n = 0   loop do     Fiber.yield(n)     n += 1   end end 5.times do  p f.resume #  end
  11. 11. f = Fiber.new do #    n = 0   loop do     Fiber.yield(n)     n += 1   end end 5.times do  p f.resume #  end
  12. 12. ‣ ‣ ‣
  13. 13. use Fiber; my $f = Fiber‐>new(   sub{                                 say 'hello';                         Fiber‐>yield;                        say 'world';                       } );
  14. 14. use Fiber; my $f = Fiber‐>new(   sub{                                 say 'hello';                         Fiber‐>yield;                        say 'world';                       } );
  15. 15. $f‐>resume;                          say 'coroutine';                     $f‐>resume; 
  16. 16. use Fiber; my $f = Fiber‐>new(   sub{                      $f‐>resume;     say 'hello';                                                     say 'coroutine';            Fiber‐>yield;           $f‐>resume;      say 'world';              } ); hello coroutine world
  17. 17. y $f = Fiber‐>new(sub{     my $s = SpaceShip‐>new;     do { $s‐>move_up;    Fiber‐>yield } for (1..100);     do { $s‐>move_rihgt; Fiber‐>yield } for (1..100);     do { $s‐>move_down;  Fiber‐>yield } for (1..100);     do { $s‐>move_left;  Fiber‐>yield } for (1..100); }); while (1) {     $f‐>resume; }
  18. 18. ‣ ‣
  19. 19. use Fiber; my $factorial = Fiber‐>new(sub{     my $n   = 1;     my $val = 1;     while (1) {         $val = $val * $n++;         Fiber‐>yield($val);     } }); $factorial‐>resume; # 1 $factorial‐>resume; # 2 $factorial‐>resume; # 6
  20. 20. 1 2 3
  21. 21. my $state1, $state2, $state3;                    $state1 = Fiber‐>new(sub {                           ## setup process for state1     while (1) {         say 'process state1';         Fiber‐>yield($state2);     } });   $state2 = Fiber‐>new(sub { ... });   $state3 = Fiber‐>new(sub { ... });   # scheduler my $cur_state = $state1; while (1) {     $cur_state = $cur_state‐>resume; }
  22. 22. ‣ ‣
  23. 23. my $c = Fiber>new( $c‐>resume;  sub{                    say 'hello!';          Fiber‐>yield;           say 'happy'; $c‐>resume;   say 'perl';             Fiber‐>yield;            say 'coding'; $c‐>resume;   say 'world!';          } );   
  24. 24.

×