Tim Peters wrote:
I expected the following would work, but it doesn't :-)
iseven = lambda n: ( lambda n=n, \ even = (lambda n: n == 0 or odd(n-1)), \ odd = (lambda n: False if n == 0 else even(n-1)): even(n))()
Ugly and obscure, but why not? In the inner lambda, `n`, `even`, and `odd` are all defined in its namespace,
But 'even' and 'odd' not defined in the environment of the lambdas assigned to them, because default values of a function's arguments are evaluated outside of that function.
For `even` to know at compile-time that `odd` will show up later in its enclosing lambda's arglist requires that Python do `letrec`-style binding instead. For a start ;-)
One could envisage adding a letrec-like construct, but making the argument list of an ordinary lambda behave like a letrec would be warping things rather too much, IMO. Personally I'd rather just add a "where" clause, and backwards compatibility be damned. :-) -- Greg