Além disso existem casos de
algoritmos que precisam de mais
de duas chamadas
recursivas(multiple recursion) e
não tem como colocar tudo no final
Slide 32
Slide 32 text
COMO LIDAR COM ISSO?
Slide 33
Slide 33 text
CONTINUATION PASSING
STYLE (CPS)
Slide 34
Slide 34 text
Um estilo de programação em que
o controle é passado
explicitamente em forma de
continuação
Slide 35
Slide 35 text
Continuação é uma parte de
código que ainda vai ser executada
em algum ponto do programa
Callbacks por exemplo são continuations
Slide 36
Slide 36 text
Continuação não chama a si mesma, ela só expressa
um fluxo de computação onde os resultados fluem
em uma direção.
Aplicar continuações não é chamar funções é passar
o controle do resultado.
Ou seja, o programa espera receber os
dados antes de continuar.
Slide 41
Slide 41 text
E daí?
Slide 42
Slide 42 text
CPS elimina a necessidade de um
call stack pois os valores estarão
dentro da continuation sendo
executada .
Slide 43
Slide 43 text
Acumulador para uma
continuação
Slide 44
Slide 44 text
IDENTITY FUNCTION
Slide 45
Slide 45 text
const id = x => x
Slide 46
Slide 46 text
● O último parâmetro da função é sempre a
continuation.
● Todas as funções precisam acabar chamando
sua continuação com o resultado da execução
da função.
● É um loop que chama funções repetidamente
● Cada função é chamada de thunk.
● O trampolim nunca chama mais de um thunk
● É como se quebrasse o programa em pequenos
thunks que saltam pra fora do trampolim, assim o
stack não cresce.
Slide 57
Slide 57 text
const trampolineFac = (n) {
const fac = (n, ac = 1) => {
return n == 0
? ac
: thunk(fac, n - 1, ac * n)
}
return trampoline(thunk(fac, n, 1))
}
Slide 58
Slide 58 text
GC
fac(3)
GC
call
GC
fac(2)
GC GC
bounce
bounce
Slide 59
Slide 59 text
:(
Slide 60
Slide 60 text
Trade off por stack safety
Trocamos o trabalho de criar stack frames com
o de criar binding de funções.
Slide 61
Slide 61 text
Em muitos casos o trade-off de
overhead por expressividade vale a
pena
Slide 62
Slide 62 text
Trampolines são mais apropriadas
para funções complexas em que não
existem soluções iterativas e não
conflitam com outras técnicas de
mediar controle de fluxo(Promises).
Slide 63
Slide 63 text
● Kyle Simpson. Functional Light Programming. Cap
8. - github.com/getify/Functional-Light-JS
● Functional Programming Jargon -
github.com/hemanth/functional-programming-jarg
on
● Structure and Interpretation of Computer
Programs - Javascript Adaptation