Il existe également le sens de 'trampoline' en LISP tel que décrit sur Wikipedia :
Utilisé dans certaines implémentations de LISP, un trampoline est une boucle qui invoque de manière itérative des fonctions renvoyant un thunk. Un seul trampoline est suffisant pour exprimer tous les transferts de contrôle d'un programme ; un programme ainsi exprimé est trampoliné ou en "style trampoliné" ; convertir un programme en style trampoliné est du trampolinage. Les fonctions trampolinées peuvent être utilisées pour implémenter des appels de fonction récursive terminale dans des langages orientés sur la pile
Disons que nous utilisons Javascript et que nous voulons écrire la fonction Fibonacci naïve en style de passage de continuation. La raison pour laquelle nous ferions cela n'est pas pertinente - pour porter Scheme vers JS par exemple, ou pour jouer avec le CPS que nous devons de toute façon utiliser pour appeler des fonctions côté serveur.
Ainsi, la première tentative est la suivante :
function fibcps(n, c) {
if (n <= 1) {
c(n);
} else {
fibcps(n - 1, function (x) {
fibcps(n - 2, function (y) {
c(x + y)
})
});
}
}
Cependant, en exécutant ceci avec n = 25
dans Firefox, une erreur 'Trop de récursion !' se produit. C'est précisément le problème (optimisation des appels récursifs terminaux manquante en Javascript) que la trampolisation résout. Au lieu de faire un appel (récursif) à une fonction, retournons 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]});
}
2 votes
Dans le monde Microsoft, les trampolines sont généralement appelés "thunks". [Voici une page](http://books.google.com/books?id=aJ1av7UFBPwC&pg=PA280&lpg=PA280&dq=thunk+trampoline&source=web&ots=YQcG0nOf7Z&sig=PZA-Pbx19C9Mnw\_1myezK4x3QWQ&hl=en&sa=X&oi=book\_result&resnum=4&ct=result) tirée du livre "Modern C++ Design" d'Andrei Alexandrescu.
1 votes
Lié
0 votes
C'est essentiellement la forme généralisée de certaines fonctionnalités que vous pourriez implémenter avec setjmp/longjmp, à savoir éviter le dépassement de pile.
26 votes
Pourquoi quelqu'un voudrait-il éviter Stack Overflow ?