¿Alguien puede explicar esta continuación en el esquema?
-
22-07-2019 - |
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))
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 valorcont
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