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

_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to