-
Notifications
You must be signed in to change notification settings - Fork 138
/
Coroutine.pir
94 lines (62 loc) · 1.74 KB
/
Coroutine.pir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
=head1 Coroutine Example
This example shows the usage of C<Stream::Coroutine>.
You can only write to the stream with yielding.
Stream::Sub has the advantage that the stream object can be passed to other
functions that in turn can write to the stream, which is not possible with
coroutine streams.
On the other hand, Stream::Coroutine is more lightweight than Stream::Sub.
=head1 FUNCTIONS
=over 4
=item _main
Creates a coroutine stream and dumps it.
=cut
.sub _main :main
.local pmc stream
.local pmc temp
load_bytecode "Stream/Base.pbc"
load_bytecode "Stream/Coroutine.pbc"
# create the coroutine stream
stream = new ['Stream'; 'Coroutine']
# set the stream's source coroutine
# A .Sub is a coroutine when there is a yield?
.const 'Sub' temp = "_coro"
assign stream, temp
#stream."source"( temp )
# dump the stream
stream."dump"()
end
.end
=item _coro
This sub is a coroutine that is used as the source of the stream.
It just writes the numbers 0 to 9 to the stream.
=cut
.sub _coro
.param pmc stream
.local int i
.local string str
i = 0
LOOP:
str = i
.yield(str)
inc i
if i < 10 goto LOOP
# the stream is automatically closed if you return a null string
# you can also close it explicitly with
# stream."close"()
# in which case it doesn't matter what you are returning.
null str
.return(str)
.end
=back
=head1 AUTHOR
Jens Rieks E<lt>parrot at jensbeimsurfen dot deE<gt> is the author
and maintainer.
Please send patches and suggestions to the Perl 6 Internals mailing list.
=head1 COPYRIGHT
Copyright (C) 2004-2009, Parrot Foundation.
=cut
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: