Estilo de passagem de continuação no esquema?
-
15-11-2019 - |
Pergunta
me deparei com esse código na Wikipédia:
(define (pyth x y k)
(* x x (lambda (x2)
(* y y (lambda (y2)
(+ x2 y2 (lambda (x2py2)
(sqrt x2py2 k))))))))
O artigo diz que esse código é a versão Continuation-Passing de outro trecho de código:
(define (pyth x y)
(sqrt (+ (* x x) (* y y))))
No entanto, estou bastante confuso:Como isso funciona?Como você multiplica um número por um lambda aqui? (* x x (lambda ...))
Solução
No exemplo da Wikipédia, *
não significa a mesma coisa que *
no exemplo convencional.
Eu reescreveria o exemplo da Wikipedia como:
(define (pyth x y k)
(cps-* x x (lambda (x2)
(cps-* y y (lambda (y2)
(cps-+ x2 y2 (lambda (x2py2)
(cps-sqrt x2py2 k))))))))
Neste formulário, cada um dos cps-xxx
funções executam a operação indicada e depois passam o resultado para o último argumento.Você poderia chamá-lo assim:
(pyth 2 3 display)
que multiplicaria 2 e 3, dando 6, e depois passando 6 para display
.(Na verdade, você gostaria de passar o resultado para um cps-display
que exibiu seu(s) argumento(s) inicial(is) e então chamou outro função especificada como seu último parâmetro).