[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / tutorial / 82_coroutine.pir
blob67139fb0b6a7f5767e6088d7954bbbef0628ff49
1 # Copyright (C) 2007-2009, Parrot Foundation.
2 # $Id$
4 =head1 Coroutines
6 Coroutines are like special subroutines that use C<.yield> instead of
7 C<.return>. In a normal subroutine, C<.return> passes results back to
8 the caller, and then destroys the subroutine environment. C<.yield> on
9 the other hand returns results to the parent but does not destroy the
10 subroutine environment. The next time the coroutine is called, it
11 continues execution from the point of the last C<.yield>, as if nothing
12 has happened. If a coroutine calls C<.return> eventually, it is
13 destroyed like a normal subroutine and the next call to it will start
14 from the beginning of the coroutine.
16 =cut
18 .sub main :main
19     $I0 = autoincrement()
20     print $I0
21     print "\n"
23     $I1 = autoincrement()
24     print $I1
25     print "\n"
27 .end
29 .sub autoincrement
30     $I0 = 1
31   start_loop:
32     $I0 += 1
33     .yield($I0)
34   goto start_loop
35 .end
37 # Local Variables:
38 #   mode: pir
39 #   fill-column: 100
40 # End:
41 # vim: expandtab shiftwidth=4 ft=pir: