Es ist doch unerheblich, ob es sich um einen rekursiven Aufruf derselben Funktion oder einen nicht-rekursiven Aufruf einer anderen Funktion handelt, und auch, wann der Name der Funktion eines Tail Calls bekannt ist. Wichtig ist doch nur, dass der aktuelle Call Frame durch den des Tail Calls ersetzt werden kann, damit der Call Stack nicht wächst.BlackJack hat geschrieben:@fail: TCO allgemein unterstützen? [...] Den Namen werden erst spät aufgelöst, womit bei einem Funktionsaufruf erst klar ist welche Funktion da tatsächlich hinter steckt, wenn sie auch tatsächlich aufgelöst und aufgerufen wird. Eine Python-Implementierung müsste also zur Laufzeit ständig den Aufrufstapel im Auge behalten und schauen ob eine Funktion dort rekursiv aufgerufen wird und ob das ein optimierbarer, also endrekursiver Aufruf ist. Diesen Mehraufwand hätte man bei jedem Funktionsaufruf, obwohl die Mehrzahl der Aufrufe gar nicht rekursiv ist.
AFAIR hat Guido zwei Argumente gebracht, warum er keine Tail Calls möchte: erstens, weil Stack Traces nicht mehr mit dem tatsächlichen Ablauf des Programms übereinstimmen würden (was man aber wohl lösen könnte), und zweitens, dass man, wenn man möchte, Tail Calls bereits jetzt via eines Trampolins selbser bauen kann, weswegen man die Sprache nicht damit belasten muss. Dazu verweise ich auf eines meiner ersten Postings hier im Forum.
Davon abgesehen, hätte ich ebenfalls gerne Tail Calls.