2009-04-16 13 views
5

Así que creo que entiendo las continuidades ahora, al menos en cierto nivel, gracias a community scheme wiki y Learn Scheme in Fixnum Days.Buscando código de ejemplo artificial: continuaciones!

Pero me gustaría tener más práctica, es decir, más código de ejemplo que pueda resolver en mi cabeza (preferiblemente ideado, para que no haya elementos extraños que distraigan del concepto).

Específicamente, 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 conoces buenos tutoriales además de los que he vinculado anteriormente, o si te gustaría publicar algo que hayas escrito que sería un buen ejercicio, ¡te lo agradecería mucho!

Respuesta

5

Sí, las continuaciones pueden ser bastante alucinantes. Aquí está un buen rompecabezas que encontré hace un tiempo - tratar de averiguar lo que está impresa 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. Los primeros call/cc tiendas devuelve su propia continuación y la almacena en k. El número 1 se escribe en la pantalla.
  2. La continuación actual, que es continuar en el punto B, se devuelve a k, que devuelve a A
  3. Esta vez, k está ligado a la continuación llegamos en el B
  4. El número 1 se escribe de nuevo a la pantalla
  5. la continuación actual, que es continuar en el punto B, se devuelve a k, que es otro (pero diferente) continuación a otro punto B
  6. vez estamos de vuelta en la continuación original, es importante tener en cuenta que aquí k todavía está obligado a A
  7. El número 2 se escribe en la pantalla
  8. La continuación actual, que es continuar en el punto C, se devuelve a k, que devuelve a A
  9. Esta vez, k está ligado a la continuación llegamos a C
  10. el número 1 está escrito de nuevo a la pantalla
  11. la continuación actual, que es para continuar en el punto B, se devuelve a k, que vuelve a C
  12. el número 3 se escribe en la pantalla
  13. And you're done

Por lo tanto, la salida correcta es 11213. El punto de conflicto más común que he puesto en negrita es que es importante tener en cuenta que cuando usa las continuciones para "restablecer" el valor de k, eso no afecta el valor de k en la continuación original. Una vez que sabes que es más fácil de entender.

+0

Hmm, sí, esto está destruyendo mi cerebro. csi dice que el resultado es 11213, pero solo puedo entender el '112' ... ¡Me falta algo! –

+1

he añadido una explicación - leer si estás realmente atascado. –

+0

Gracias, el punto en negrita estaba exactamente donde yo estaba confundido. Dejaron probar esto otra vez ... :) –

Cuestiones relacionadas