mi CPS es correcto?

en "The Scheme Programming Language 4th Edition", hay un ejemplo como el siguiente:


(define product
  (lambda (ls)
    (call/cc
      (lambda (break)
        (let f ([ls ls])
          (cond
            [(null? ls) 1]
            [(= (car ls) 0) (break 0)]
            [else (* (car ls) (f (cdr ls)))]))))))
(producto '(1 2 3 4 5)) => 120

(producto '(7 3 8 0 1 9 5)) => 0

más tarde se convierte en CPS en 3.3 como se muestra a continuación


(define product
  (lambda (ls k)
    (let ([break k])
      (let f ([ls ls] [k k])
        (cond
          [(null? ls) (k 1)]
          [(= (car ls) 0) (break 0)]
          [else (f (cdr ls)
                   (lambda (x)
                     (k (* (car ls) x))))])))))
(producto '(1 2 3 4 5) (lambda (x) x)) => 120

(producto '(7 3 8 0 1 9 5) (lambda (x) x)) => 0

Quiero hacerlo yo mismo, el CPS correspondiente está abajo


 (define (product ls prod break)
    (cond
      ((null? ls)
       (break prod))
      ((= (car ls) 0)
       (break 0))
      (else
        (product (cdr ls) (* prod (car ls)) break))))
(producto '(1 2 3 4 5) 1 (lambda (x) x)) => 120

(producto '(1 2 0 4 5) 1 (lambda (x) x)) => 0

Quiero preguntar si mi CPS es correcto? ¡Gracias de antemano!

Saludos cordiales

preguntado el 04 de julio de 12 a las 08:07

¿Dónde están sus casos de prueba? Esto no pretende ser una pregunta frívola. Si no sabe cómo llamar a una función de CPS, se ha perdido algo importante. -

Además, debe tener en cuenta que la función que ha CPSed no es la función de "producto" original, sino una que está escrita con un acumulador estándar. (definir (pl acc) (if (nulo? l) acc (p (cdr l) (* acc (car l)))) no es exactamente la función que transformaste, pero está cerca. (Mi definición de f simplemente omite el escape temprano cuando llegamos a un cero). En cualquier caso, la función que transformó exhibió recursividad iterativa, y puede ver esto porque su versión CPSed no necesita construir nuevas continuaciones. -

El caso original está aquí:esquema.com/tspl4/más.html#./más:h4 -

1 Respuestas

Creo que esta es la implementación correcta:

(define inside-product #f)  ;; to demonstrate the continuation

(define (product ls prod break)
  (cond
    ((null? ls)
     (begin
       (set! inside-product prod)
       (prod 1)))
    ((= (car ls) 0)
     (break 0))
    (else
     (product (cdr ls) (lambda (x) (prod (* (car ls) x))) break))))

(define identity (lambda (x) x))

La idea de CPS es mantener un registro de la recursividad.

> (product (list 1 2 3) identity identity)
6
> (inside-product 4)
24

Respondido 07 Jul 12, 00:07

Desafortunadamente, tengo que -1 esto: ¡no hay un uso de set! en el código original, y el uso de la mutación aquí confunde los problemas. - dyoo

¡Utilicé el conjunto! a propósito, con el fin de demostrar la continuación. Cuando se llega al final de la lista, el valor del producto interno se establece en la continuación. Entonces, una vez que se ejecuta el procedimiento del producto como se muestra en el ejemplo, el valor del producto interno se establece en (lambda (x) ((lambda (x) ((lambda (x) (identidad (* 1 x)))) ( * 2x))) (* 3x))) - Rajesh Bhat

Hmmmm está bien. La pregunta que hizo el interrogador original sigue siendo ambigua, ya que necesita decir qué función se transformó en CPS. Por lo que puedo decir, pinchar se supone que es un acumulador en la pregunta original. Sin embargo, no hay código fuente original antes de la transformación CPS en la pregunta que corresponde a un uso de pinchar Por aquí. Así que algo falta en la pregunta. - dyoo

En mi pregunta original, prod es un número 1, entonces, puedo llamar "producto" así: (producto '(1 2 3 4 5) 1 (lambda (x) x)) => 120, tal vez, mi entendimiento sobre CPS esta mal, Donde puedo estudiar CPS paso a paso, Gracias de antemano! - abelardo2008

Puede consultar libros de texto como Lenguajes de programación: aplicación e interpretación, así como Fundamentos de los lenguajes de programación. Ambos tienen capítulos sobre CPS, si mal no recuerdo. Busque en Google "PLAI" y debería encontrar el primer libro de texto en línea. - dyoo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.