> * 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