Terry Reedy wrote:
One of the explicit reasons for introducing closures defined by nesting was to reduce default value use.
Indeed, and the question that needs to be asked is: Why does the default argument hack persist, when we now have a lexical scope system that's just as good as other languages such as Scheme and Haskell have, yet no such kludge seems to be needed in those languages? I don't believe it's because there's anything wrong with our functions or closures. Rather, it's a symptom of lingering deficiencies in *other* parts of the language. For example, when someone writes for i in things: def f(): dosomethingwith(i) squirrelaway(f) and get surprised by the result, he's effectively assuming that the for-loop creates a new binding for i each time around. He may not *realise* he's assuming that, but he is. Given that people seem to unconsciously make that assumption, perhaps we should consider making the for-loop actually behave that way. There's a precedent for this -- list comprehensions used to leak their loop variable into the surrounding scope, but that was eventually changed. Another point I'd like to make is that I don't think Nick's proposal, or any spelling variation of it, helps all that much in this case. Having to do *anything* special in or around the function to work around this problem is something of a kludge, especially if it involves writing anything as tautological-looking as "i = i". -- Greg