Há também o sentido LISP de 'trampolim', conforme descrito na Wikipedia:
Usado em algumas implementações LISP, um trampolim é um loop que invoca funções de retorno de conversão de forma iterativa. Um único trampolim é suficiente para expressar todas as transferências de controle de um programa; um programa assim expresso é trampolim ou em "estilo trampolim"; converter um programa para o estilo trampolim é trampolim. Funções trampolinhadas podem ser usadas para implementar chamadas de função recursiva final em linguagens orientadas a pilha
Digamos que estejamos usando Javascript e queremos escrever a função Fibonacci ingênua no estilo continuation-pass. A razão pela qual faríamos isso não é relevante - para portar Scheme para JS, por exemplo, ou para brincar com CPS que temos que usar de qualquer maneira para chamar funções do lado do servidor.
Então, a primeira tentativa é
function fibcps(n, c) {
if (n <= 1) {
c(n);
} else {
fibcps(n - 1, function (x) {
fibcps(n - 2, function (y) {
c(x + y)
})
});
}
}
Mas, ao executá-lo n = 25
no Firefox, aparecerá um erro 'Muita recursão!'. Bem, este é exatamente o problema (falta de otimização de chamada de cauda em Javascript) que o trampolim resolve. Em vez de fazer uma chamada (recursiva) para uma função, vamos return
usar uma instrução (thunk) para chamar essa função, para ser interpretada em um loop.
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]});
}