Fortsetzung-Passing-Stil im Schema?
-
15-11-2019 - |
Frage
Ich bin auf diesen Code gestoßen auf Wikipedia:
(define (pyth x y k)
(* x x (lambda (x2)
(* y y (lambda (y2)
(+ x2 y2 (lambda (x2py2)
(sqrt x2py2 k))))))))
Der Artikel besagt, dass dieser Code die fortlaufende Version eines anderen Codes ist:
(define (pyth x y)
(sqrt (+ (* x x) (* y y))))
Ich bin jedoch ziemlich verwirrt:Wie funktioniert das überhaupt?Wie multipliziert man hier eine Zahl mit einem Lambda? (* x x (lambda ...))
Lösung
Im Wikipedia-Beispiel, *
bedeutet nicht dasselbe wie *
im herkömmlichen Beispiel.
Ich würde das Wikipedia-Beispiel umschreiben als:
(define (pyth x y k)
(cps-* x x (lambda (x2)
(cps-* y y (lambda (y2)
(cps-+ x2 y2 (lambda (x2py2)
(cps-sqrt x2py2 k))))))))
In dieser Form kann jeder der cps-xxx
funktionen führen die angegebene Operation aus und übergeben das Ergebnis dann an das letzte Argument.Man könnte es so nennen:
(pyth 2 3 display)
das würde 2 und 3 multiplizieren, 6 ergeben und dann 6 an übergeben display
.(Eigentlich möchten Sie das Ergebnis an a übergeben.) cps-display
das zeigte seine anfänglichen Argumente an und rief dann auf ein anderer funktion, die als letzter Parameter angegeben ist).