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 ...))

Était-ce utile?

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top