Pregunta

Así que creo entender continuaciones ahora, al menos en algún nivel, gracias a la esquema wiki de la comunidad y Aprender Esquema de Fixnum Días .

Pero me gustaría practicar más -. Es decir, más código de ejemplo que puedo trabajar a través de mi cabeza (preferiblemente artificial, así que no hay cosas extrañas a distraer del concepto)

En concreto , me gustaría trabajar a través de más problemas con las continuaciones que resumen y / o co-rutinas, en lugar de sólo utilizarlos para salir de un bucle o lo que sea (que es bastante sencillo).

De todos modos, si usted sabe de buenos tutoriales, además de los que he vinculado anteriormente, o si había cuidado a publicar algo que has escrito que sería un buen ejercicio, estaría muy agradecido!

¿Fue útil?

Solución

Sí, continuaciones pueden ser bastante alucinante. He aquí un buen rompecabezas que encontré hace un tiempo - tratar de averiguar lo que está impreso y por qué:

(define (mondo-bizarro)
  (let ((k (call/cc (lambda (c) c)))) ; A
    (write 1)
    (call/cc (lambda (c) (k c))) ; B 
    (write 2)
    (call/cc (lambda (c) (k c))) ; C
    (write 3)))

(mondo-bizarro)

Explicación de cómo funciona esto (contiene spoilers!):

  1. Las tiendas de primera call/cc devuelve su propia continuación y lo almacena en k.
  2. El 1 número se escribe en la pantalla.
  3. La continuación actual, que es para continuar en el punto B, se devuelve a k, que vuelve a A
  4. Esta vez, k está ligado a la continuación llegamos a B
  5. El 1 número se escribe de nuevo a la pantalla
  6. La continuación actual, que es para continuar en el punto B, se devuelve a k, que es otro (pero diferente) continuación a otro punto B
  7. Una vez que estamos de vuelta en la continuación original, es importante tener en cuenta que aquí k se obliga todavía a A
  8. El 2 número se escribe en la pantalla
  9. La continuación actual, que es para continuar en el punto C, se devuelve a k, que vuelve a A
  10. Esta vez, k está ligado a la continuación llegamos a C
  11. El 1 número se escribe de nuevo a la pantalla
  12. La continuación actual, que es para continuar en el punto B, se devuelve a k, que vuelve a C
  13. El 3 número se escribe en la pantalla
  14. Y ya está

Por lo tanto, la salida correcta es 11213. El punto de conflicto más común que he puesto en negrita - es importante tener en cuenta que cuando se utiliza continuaciones de 'reset' el valor de k que no afecta el valor de k de nuevo en la continuación originales. Una vez que sepa que sea más fácil de entender.

Otros consejos

Curso de lenguajes de programación de la Universidad de Brown tiene una problema situado en continuaciones a disposición del público.

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