Antoine Pitrou wrote:
def parse_items(closing_tag = None): elems = [] while 1: token = token_stream.next() if not token: break # EOF [etc.]
It looks like parse_items pulls from token_stream until exhaustion.
Only the outermost call does that. The recursive calls are made with a closing_tag value, and parse_items stops as soon as it reaches that. Writing a for-loop would give the erroneous impression that we were looping to exhaustion, when most of the time we're not. Also, even in the outer call, it stops when it gets a token of None, which is half a loop sooner than the scanner becomes exhausted. If a for-loop were used, it would always be exited via a break. Thirdly, if I had used a for-loop there, I would have to have turned it into a while loop for the push version, and that would have obscured the symmetry between the two versions. -- Greg