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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top