Pregunta

Estoy aprendiendo continuaciones pero no puedo entender este código. ¿Por qué entra en bucle infinito?

(let ((cont #f))
  (call/cc (lambda (k)
             (set! cont k)))
  (cont #f))
¿Fue útil?

Solución

Línea por línea:

  • definimos la variable local cont
  • llamamos con continuación actual alguna función lambda, es decir, estamos pasando la continuación actual a la función lambda como argumento. La continuación actual es una función de 1 argumento, este argumento se usa como un "valor de retorno" de call / cc (y aquí eventualmente se ignora).
  • Entonces k aquí significa todo, eso sucederá después, en nuestro caso algo cercano en sentido a (lambda (call / cc-retval) (let () call / cc-retval (cont #f))) . Establecemos el valor cont en esta continuación. call / cc regresa.
  • Dado que cont ahora es una función que representa la continuación, y su argumento es el valor de retorno de call / cc, simplemente llamamos a esa función, el argumento se ignora y necesitamos llamar al (cont #f) nuevamente.

Por lo tanto, lo que finalmente conseguimos es un bucle infinito.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top