annotate Demo/threads/squasher.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 0fa2c05188a0
children 7d16b42fcdbd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15388
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Coroutine example: general coroutine transfers
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # The program is a variation of a Simula 67 program due to Dahl & Hoare,
17134
0fa2c05188a0 Add more complete reference. Change a co.back() call to co.tran() --
Guido van Rossum <guido@python.org>
parents: 15388
diff changeset
4 # (Dahl/Dijkstra/Hoare, Structured Programming; Academic Press, 1972)
15388
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # who in turn credit the original example to Conway.
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # We have a number of input lines, terminated by a 0 byte. The problem
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # is to squash them together into output lines containing 72 characters
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # each. A semicolon must be added between input lines. Runs of blanks
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # and tabs in input lines must be squashed into single blanks.
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # Occurrences of "**" in input lines must be replaced by "^".
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 #
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # Here's a test case:
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 test = """\
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 d = sqrt(b**2 - 4*a*c)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 twoa = 2*a
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 L = -b/twoa
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 R = d/twoa
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 A1 = L + R
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 A2 = L - R\0
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 """
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 # The program should print:
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 # d = sqrt(b^2 - 4*a*c);twoa = 2*a; L = -b/twoa; R = d/twoa; A1 = L + R;
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 #A2 = L - R
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 #done
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 # getline: delivers the next input line to its invoker
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 # disassembler: grabs input lines from getline, and delivers them one
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 # character at a time to squasher, also inserting a semicolon into
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 # the stream between lines
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 # squasher: grabs characters from disassembler and passes them on to
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 # assembler, first replacing "**" with "^" and squashing runs of
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 # whitespace
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 # assembler: grabs characters from squasher and packs them into lines
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 # with 72 character each, delivering each such line to putline;
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 # when it sees a null byte, passes the last line to putline and
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 # then kills all the coroutines
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 # putline: grabs lines from assembler, and just prints them
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 from Coroutine import *
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 def getline(text):
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 for line in string.splitfields(text, '\n'):
17134
0fa2c05188a0 Add more complete reference. Change a co.back() call to co.tran() --
Guido van Rossum <guido@python.org>
parents: 15388
diff changeset
47 co.tran(codisassembler, line)
15388
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
48
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 def disassembler():
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 while 1:
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 card = co.tran(cogetline)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 for i in range(len(card)):
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 co.tran(cosquasher, card[i])
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 co.tran(cosquasher, ';')
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
55
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 def squasher():
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 while 1:
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 ch = co.tran(codisassembler)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 if ch == '*':
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 ch2 = co.tran(codisassembler)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 if ch2 == '*':
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 ch = '^'
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 else:
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 co.tran(coassembler, ch)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 ch = ch2
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 if ch in ' \t':
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 while 1:
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 ch2 = co.tran(codisassembler)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 if ch2 not in ' \t':
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 break
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 co.tran(coassembler, ' ')
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 ch = ch2
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 co.tran(coassembler, ch)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
74
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 def assembler():
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 line = ''
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 while 1:
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 ch = co.tran(cosquasher)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 if ch == '\0':
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 break
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 if len(line) == 72:
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 co.tran(coputline, line)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 line = ''
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 line = line + ch
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 line = line + ' ' * (72 - len(line))
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 co.tran(coputline, line)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 co.kill()
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
88
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 def putline():
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 while 1:
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 line = co.tran(coassembler)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 print line
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
93
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 import string
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 co = Coroutine()
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 cogetline = co.create(getline, test)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 coputline = co.create(putline)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 coassembler = co.create(assembler)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 codisassembler = co.create(disassembler)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 cosquasher = co.create(squasher)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
101
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 co.tran(coputline)
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 print 'done'
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
104
f2901b6ac5ed Add 1994 Coroutine module by Tim Peters
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 # end of example