También existe el sentido LISP de 'trampolín' como se describe en Wikipedia:
Utilizado en algunas implementaciones de LISP, un trampolín es un bucle que invoca de forma iterativa funciones de retorno de procesador. Un solo trampolín es suficiente para expresar todas las transferencias de control de un programa; un programa así expresado está en trampolín o en "estilo trampolín"; convertir un programa al estilo trampolín es trampolín. Las funciones de trampolín se pueden usar para implementar llamadas de función recursivas de cola en lenguajes orientados a pilas
Digamos que estamos usando Javascript y queremos escribir la función de Fibonacci ingenua en estilo de continuación-paso. La razón por la que haríamos esto no es relevante: para portar Scheme a JS, por ejemplo, o para jugar con CPS, que tenemos que usar de todos modos para llamar a las funciones del lado del servidor.
Entonces, el primer intento es
function fibcps(n, c) {
if (n <= 1) {
c(n);
} else {
fibcps(n - 1, function (x) {
fibcps(n - 2, function (y) {
c(x + y)
})
});
}
}
Pero, ejecutar esto con n = 25
en Firefox da un error '¡Demasiada recursividad!'. Ahora bien, este es exactamente el problema (falta la optimización de la llamada de cola en Javascript) que resuelve el trampolín. En lugar de hacer una llamada (recursiva) a una función, permítanos return
una instrucción (thunk) para llamar a esa función, para ser interpretada en un bucle.
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]});
}