Il y a aussi le sens LISP de `` trampoline '' tel que décrit sur Wikipedia:
Utilisé dans certaines implémentations LISP, un trampoline est une boucle qui invoque de manière itérative des fonctions de retour de thunk. Un seul trampoline suffit pour exprimer tous les transferts de contrôle d'un programme; un programme ainsi exprimé est trampoline ou "style trampoline"; convertir un programme en style trampoline est du trampoline. Les fonctions trampolinées peuvent être utilisées pour implémenter des appels de fonction récursifs de queue dans des langages orientés pile
Disons que nous utilisons Javascript et que nous voulons écrire la fonction naïve de Fibonacci en continuation-pass-style. La raison pour laquelle nous ferions cela n'est pas pertinente - pour porter Scheme sur JS par exemple, ou pour jouer avec CPS que nous devons utiliser de toute façon pour appeler des fonctions côté serveur.
Donc, la première tentative est
function fibcps(n, c) {
if (n <= 1) {
c(n);
} else {
fibcps(n - 1, function (x) {
fibcps(n - 2, function (y) {
c(x + y)
})
});
}
}
Mais, exécuter ceci avec n = 25
dans Firefox donne une erreur «Trop de récursivité!». Maintenant, c'est exactement le problème (l'optimisation des appels de queue manquante en Javascript) que le trampoline résout. Au lieu de faire un appel (récursif) à une fonction, laissez-nous return
une instruction (thunk) pour appeler cette fonction, à interpréter dans une boucle.
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]});
}