Dieser letzte Vorteil ist es, an dem mir gelegen ist. Dann könnte man bequem Continuation Style Passing verwenden. Ob das ein paar Zyklen mehr braucht, wäre mir egal.lunar hat geschrieben:CL-Implementierungen, die TCO unterstützen, tun dies dagegen ziemlich sicher auf die genannte Weise: Sie werfen zur Laufzeit den Stapelrahmen weg, wenn ein letzter Aufruf stattfindet. Der teure Funktionsaufruf selbst bleibt also, womit ein großer Vorteil der TCO in Haskell oder C verloren geht. Der einzige verbleibende Vorteil der TCO ist dann, dass der Aufrufstapel nicht wächst.
Ich kann das auch verstehen. Allerdings könnte man auch fragen, ob die Tatsache, dass Rekursion nicht zum normalen Idiom gehört, nicht vielleicht daran liegt, dass es kein TCO gibt?lunar hat geschrieben:Ich kann gut verstehen, dass man für diesen, in einer Sprache, in der Rekursion nicht zum normalen Idiom gehört, verhältnismäßig kleinen Vorteil nicht den Interpreter verkomplizieren und lesbare Stacktraces zerstören möchte.
Man könnte übrigens auch zB. ein return from Statement o.ä. einführen, dann kann der Compiler dumm bleiben und der Programmierer kann dadurch explizit machen, dass ihm mehr daran gelegen ist, einen Stack Overflow zu vermeiden, als aussagekräftige Stack Traces zu haben.
Ich denke, das folgt nicht daraus, da man ja auch Funktionen als Parameter übergeben kann oder lokal definieren kann. TCO sollte auch in solchen Fällen funktionieren. Wie das genau in Scheme geregelt ist, muss ich nachlesen.lunar hat geschrieben:Edit: Top-Level Definitionen sind in Scheme offenbar statisch, und können zur Laufzeit nicht mehr verändert werden. Mithin kann der Compiler jeden Funktionsaufruf lexikalisch auflösen und mithin statisch binden.