Es gibt auch den LISP-Sinn für "Trampolin", wie auf Wikipedia beschrieben:
In einigen LISP-Implementierungen wird ein Trampolin als Schleife verwendet, die iterativ Thunk-Return-Funktionen aufruft. Ein einziges Trampolin reicht aus, um alle Kontrollübertragungen eines Programms auszudrücken. ein so ausgedrücktes Programm ist trampoliniert oder "trampoliniert"; Das Konvertieren eines Programms in einen trampolinierten Stil ist Trampolin. Trampolinfunktionen können verwendet werden, um rekursive Funktionsaufrufe in stapelorientierten Sprachen zu implementieren
Nehmen wir an, wir verwenden Javascript und möchten die naive Fibonacci-Funktion im Continuation-Passing-Stil schreiben. Der Grund, warum wir dies tun würden, ist nicht relevant - zum Beispiel, um Scheme auf JS zu portieren oder um mit CPS zu spielen, das wir sowieso verwenden müssen, um serverseitige Funktionen aufzurufen.
Der erste Versuch ist also
function fibcps(n, c) {
if (n <= 1) {
c(n);
} else {
fibcps(n - 1, function (x) {
fibcps(n - 2, function (y) {
c(x + y)
})
});
}
}
Wenn Sie dies jedoch n = 25
in Firefox ausführen, wird der Fehler "Zu viel Rekursion!" Angezeigt. Dies ist genau das Problem (fehlende Tail-Call-Optimierung in Javascript), das Trampolin löst. Anstatt eine Funktion (rekursiv) aufzurufen, geben wir return
eine Anweisung (thunk) an, um diese Funktion aufzurufen und in einer Schleife zu interpretieren.
function fibt(n, c) {
function trampoline(x) {
while (x && x.func) {
x = x.func.apply(null, x.args);
}
}
function fibtramp(n, c) {
if (n <= 1) {
return {func: c, args: [n]};
} else {
return {
func: fibtramp,
args: [n - 1,
function (x) {
return {
func: fibtramp,
args: [n - 2, function (y) {
return {func: c, args: [x + y]}
}]
}
}
]
}
}
}
trampoline({func: fibtramp, args: [n, c]});
}