C'è anche il senso LISP di 'trampolino' come descritto su Wikipedia:
Utilizzato in alcune implementazioni LISP, un trampolino è un ciclo che richiama in modo iterativo funzioni di ritorno thunk. Un singolo trampolino è sufficiente per esprimere tutti i trasferimenti di controllo di un programma; un programma così espresso è trampolino o in "stile trampolino"; convertire un programma in stile trampolino è trampolino elastico. Le funzioni trampolino possono essere utilizzate per implementare chiamate di funzione ricorsive di coda in linguaggi orientati allo stack
Diciamo che stiamo usando Javascript e vogliamo scrivere l'ingenua funzione di Fibonacci in stile continuation-crossing. Il motivo per cui lo faremmo non è rilevante, ad esempio per portare Scheme su JS o per giocare con CPS che dobbiamo comunque utilizzare per chiamare funzioni lato server.
Quindi, il primo tentativo è
function fibcps(n, c) {
if (n <= 1) {
c(n);
} else {
fibcps(n - 1, function (x) {
fibcps(n - 2, function (y) {
c(x + y)
})
});
}
}
Ma, eseguendolo con n = 25
in Firefox, viene visualizzato un errore "Troppa ricorsione!". Ora questo è esattamente il problema (ottimizzazione della chiamata di coda mancante in Javascript) che il trampolino risolve. Invece di fare una chiamata (ricorsiva) a una funzione, diamo return
un'istruzione (thunk) per chiamare quella funzione, da interpretare in un ciclo.
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]});
}