Wikipedia'da açıklandığı gibi LISP 'trambolin' duygusu da vardır:
Bazı LISP uygulamalarında kullanılan bir trambolin, thunk-dönen işlevleri yinelemeli olarak çağıran bir döngüdür. Bir programın tüm kontrol transferlerini ifade etmek için tek bir trambolin yeterlidir; bu şekilde ifade edilen bir program tramplenle veya "tramplenle taranmış tarzda"; Bir programı tramplenli stile dönüştürmek tramplen yapmaktır. Trampollenmiş işlevler, yığın yönelimli dillerde kuyruk özyinelemeli işlev çağrıları uygulamak için kullanılabilir
Diyelim ki Javascript kullanıyoruz ve saf Fibonacci fonksiyonunu devam eden tarzda yazmak istiyoruz. Bunu yapmamızın nedeni, örneğin, Scheme'i JS'ye taşımak veya sunucu tarafı işlevlerini çağırmak için yine de kullanmamız gereken CPS ile oynamak.
Yani, ilk girişim
function fibcps(n, c) {
if (n <= 1) {
c(n);
} else {
fibcps(n - 1, function (x) {
fibcps(n - 2, function (y) {
c(x + y)
})
});
}
}
Ancak bunu n = 25
Firefox'ta çalıştırmak 'Çok fazla özyineleme!' Hatası veriyor. Şimdi tam da bu, tramplenin çözdüğü problemdir (Javascript'te eksik kuyruk arama optimizasyonu). Bir işleve (özyinelemeli) bir çağrı yapmak yerine, return
bir döngüde yorumlanacak o işlevi çağırmak için bir talimat (thunk) edelim .
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]});
}