functional programming

Denys Duchier Denys.Duchier at
Fri Feb 25 16:33:10 EST 2000

Moshe Zadka <moshez at> writes:

> On 25 Feb 2000, Denys Duchier wrote:
> > The point, however, is moot since, as I suggested previously, the
> > finalization semantics of Python (much like that of C++) are not
> > easily reconciled with tail call optimization.
> I won't say anything about C++ (what I'd like to say about it isn't
> fit for prime time), but about Python, this is untrue: either the called
> function has a reference to the object (in which case it won't be
> finalized) or it can be deleted when the calling frame is deleted, in
> which case the call to the destructor will *precede* the tail-call,
> and still leave it in tail position.

As I said in my original message, you can indeed do this but it
violates an assumption that many Python programmers seem to care
about: namely that the destructor of an object is invoked when exiting
the scope rather than prior to the tail call, or, as the logical
generalization would have it, as soon as possible (i.e. as soon as it
is no longer referenced in subsequent code).

Consider the following (I am not saying that this is necessarily a
sensible programming style, but current Python semantics give it a
straightforward reading and I have actually occasionally done similar
things in C++):

class Lock:
	def __init__(self):
        def __del__(self):

def foo()
        lock = Lock()

It makes a difference whether the lock is released before the call to
baz() or after.  I am by no means sanguine about keeping Python's
finalization semantics, but it _is_ an issue that makes a difference.


Dr. Denys Duchier			Denys.Duchier at
Forschungsbereich Programmiersysteme	(Programming Systems Lab)
Universitaet des Saarlandes, Geb. 45
Postfach 15 11 50			Phone: +49 681 302 5618
66041 Saarbruecken, Germany		Fax:   +49 681 302 5615

More information about the Python-list mailing list