Стиль продолжения-прохождения в схеме? - PullRequest
5 голосов
/ 20 февраля 2011

Я столкнулся с этим кодом в Википедии :

(define (pyth x y k)
    (* x x (lambda (x2)
        (* y y (lambda (y2)
            (+ x2 y2 (lambda (x2py2)
                (sqrt x2py2 k))))))))

В статье говорится, что этот код является продолжением проходящей версии другого фрагмента кода:

(define (pyth x y)
    (sqrt (+ (* x x) (* y y))))

Тем не менее, я совершенно сбит с толку: как это вообще работает? Как вы умножаете число на лямбду здесь? (* x x (lambda ...))

1 Ответ

6 голосов
/ 20 февраля 2011

В примере из Википедии * не означает то же самое, что и * в обычном примере.

Я бы переписал пример из Википедии как:

(define (pyth x y k)
    (cps-* x x (lambda (x2)
        (cps-* y y (lambda (y2)
            (cps-+ x2 y2 (lambda (x2py2)
                (cps-sqrt x2py2 k))))))))

В этой форме каждая из cps-xxx функций выполняет указанную операцию и затем передает результат последнему аргументу.Вы могли бы назвать это так:

(pyth 2 3 display)

, который умножил бы 2 и 3, давая 6, а затем передавая 6 в display.(На самом деле вы хотели бы передать результат в cps-display, который отображал свои начальные аргументы и затем вызывал другую функцию , указанную в качестве последнего параметра).

...