Istnieje również znaczenie LISP-a `` trampoliny '', jak opisano w Wikipedii:
Używana w niektórych implementacjach LISP, trampolina jest pętlą, która iteracyjnie wywołuje funkcje zwracające thunk. Jedna trampolina jest wystarczająca do wyrażenia wszystkich transferów kontrolnych programu; tak wyrażony program jest trampolinowy lub w stylu trampoliny; konwersja programu do stylu trampoliny to trampolina. Funkcje trampoliny mogą być używane do implementacji wywołań funkcji rekurencyjnych ogona w językach zorientowanych na stos
Powiedzmy, że używamy Javascript i chcemy napisać naiwną funkcję Fibonacciego w stylu kontynuacji-przekazywania. Powód, dla którego byśmy to zrobili, nie jest istotny - na przykład przeniesienie Scheme do JS lub granie z CPS, którego i tak musimy używać do wywoływania funkcji po stronie serwera.
Tak więc pierwsza próba jest
function fibcps(n, c) {
if (n <= 1) {
c(n);
} else {
fibcps(n - 1, function (x) {
fibcps(n - 2, function (y) {
c(x + y)
})
});
}
}
Ale uruchomienie tego n = 25
w przeglądarce Firefox powoduje wyświetlenie błędu „Za dużo rekurencji!”. To jest dokładnie problem (brak optymalizacji wywołań ogonowych w JavaScript), który rozwiązuje trampolina. Zamiast wykonywać (rekurencyjne) wywołanie funkcji, return
użyjmy instrukcji (thunk), aby wywołać tę funkcję, aby została zinterpretowana w pętli.
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]});
}