Securing a future for anonymous functions in Python

Bengt Richter bokr at oz.net
Tue Jan 11 05:25:59 EST 2005


On Mon, 10 Jan 2005 21:15:50 -0500, Tim Peters <tim.peters at gmail.com> wrote:

>...
>
>[Anna]
>>> BTW - I am *quite* happy with the proposal for "where:" syntax - I
>>> think it handles the problems I have with lambda quite handily.
>
>[Steve Holden]
>> Whereas I find it to be an excrescence, proving (I suppose) that one
>> man's meat is another person's poison, or something.
>
>I've been waiting for someone to mention this, but looks like nobody
>will, so I'm elected.  Modern functional languages generally have two
>forms of local-name definition, following common mathematical
>conventions.  "where" was discussed here.  The other is "let/in", and
Well, I did say it reminded me of some kind of weird let ;-)
http://groups-beta.google.com/groups?q=%20Reminds%20me%20of%20some%20kind%20of%20weird%20let&hl=en&lr=&sa=N&tab=wg

>seems a more natural fit to Python's spelling of block structure:
>
>    let:
>        suite
>    in:
>        suite
>
>There's no restriction to expressions here.  I suppose that, like the
>body of a class, the `let` suite is executed starting with a
>conceptually empty local namespace, and whatever the suite binds to a
>local name becomes a temporary binding in the `in` suite (like
>whatever a class body binds to local names becomes the initial value
>of the class __dict__).  So, e.g.,
>
>    i = i1 = 3
>    let:
>        i1 = i+1
>        from math import sqrt
>    in:
>        print i1, sqrt(i1)
>    print i1,
>    print sqrt(i1)
>
>would print
>
>    4 2
>    3
>
>and then blow up with a NameError.
>
>LIke it or not, it doesn't seem as strained as trying to pile more
>gimmicks on Python expressions.
I could get to like it ;-)

Hm, a little extension to this could provide a new way to populate closure variables,
and also (never mind, one thing at a time ;-)

#1: If you gave your 'let' above a list of 'externs' that can be rebound from within the let.
E.g.,

    let(sqrt):

the effect in your example would be to eliminate the NameError you mention.
The compiler would make an entry for sqrt in the enclosing namespace, and generate
code to bind/rebind if assigned from within the let.

This would be an interesting way to create closure bindings:

    let(foo):
        preset = 'another way to make closure vairables'
    in:
        def foo(): return preset
    ...
    print foo()

#2: Making the in: suite callable as a light weight function with no arguments. An optional
binding name after in would bind like def and create a persistent named callable instead of just an
implicitly called anonymous suite.

Then you could define the same effective foo by

    let:
        preset = 'another way to make closure vairables'
    in foo:
        return preset  # return now legal 
    ...
    print foo()

The combination would work like:

    let(rebindable):
        factor = 10
    in bar:
        rebindable *= factor

    rebindable = 2
    bar()
    print rebindable  # => 20
    rebindable += 5
    bar()
    print rebindable  # => 250

You can see this could be used nicely in case functionality, with a dict of named in-functions.

What do you think?

Regards,
Bengt Richter



More information about the Python-list mailing list