> * A closure must only keep alive the varables it references, not the
> whole pad on which they are allocated (Python messed up here)

Getting off subject, but I didn't know this about python.  I'm not
saying you're incorrect, but my experimentation shows:

% cat t.py
class A(object):
    def __init__(self, name): self.name = name
    def __del__(self): print self.name, 'gone'

def f():
    x = A('x')
    y = A('y')
    def g():
        print x.name, 'alive'
    return g

% python
Python 2.5.1 (r251:54869, Apr 18 2007, 22:08:04)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
import t
g = t.f()
y gone
g()
x alive
g.func_closure
#-> (<cell at 0xefb50: A object at 0xefb90>,)
del g

x gone
%

So it looks to me like 'y' is not preserved by the closure returned by
'f', and you can see that in its func_closure which keeps the
reference to one A object, but not two.

Python closures do have a "unique" quirk, which is that variables
bound in a nested function are read-only.  This is something that a
schemer might take issue with, but a haskeller probably wouldn't
notice :)  And for the longest time python had its "two space"
namespace thing going on, so it wasn't even really lexically scoped,
but that's many years ago now.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to