Style de continuation-passe dans le schéma ?
-
15-11-2019 - |
Question
je suis tombé sur ce code sur Wikipédia:
(define (pyth x y k)
(* x x (lambda (x2)
(* y y (lambda (y2)
(+ x2 y2 (lambda (x2py2)
(sqrt x2py2 k))))))))
L'article indique que ce code est la version Continuation-Passing d'un autre morceau de code :
(define (pyth x y)
(sqrt (+ (* x x) (* y y))))
Cependant, je suis assez confus :Comment ça marche ?Comment multiplier un nombre par un lambda ici ? (* x x (lambda ...))
La solution
Dans l'exemple de Wikipédia, *
ne veut pas dire la même chose que *
dans l'exemple classique.
Je réécrirais l'exemple de Wikipédia comme suit :
(define (pyth x y k)
(cps-* x x (lambda (x2)
(cps-* y y (lambda (y2)
(cps-+ x2 y2 (lambda (x2py2)
(cps-sqrt x2py2 k))))))))
Sous cette forme, chacun des cps-xxx
les fonctions effectuent l’opération indiquée puis transmettent le résultat au dernier argument.Vous pourriez l'appeler ainsi :
(pyth 2 3 display)
ce qui multiplierait 2 et 3, donnant 6, puis passant 6 à display
.(En fait, vous voudriez transmettre le résultat à un cps-display
qui a affiché son ou ses arguments initiaux puis a appelé un autre fonction spécifiée comme son dernier paramètre).