Escribí un pequeño intérprete de Scheme en C#, y me di cuenta de que, de la manera en que lo había implementado, era muy fácil agregar soporte para las continuaciones adecuadas.Ejemplo más simple de continuaciones hacia atrás en Scheme sin mutación explícita
Así que los agregué ... pero quiero "probar" que la forma en que los agregué es correcta.
Sin embargo, el intérprete de My Scheme no tiene soporte para el estado de "mutación": todo es inmutable.
así que era bastante fácil de escribir una prueba unitaria para exponer "hacia arriba" continuaciones:
AssertEqual(Eval("(call/cc (lambda (k) (+ 56 (k 3))))"), 3);
Sin embargo, también quiero escribir una prueba unitaria que demuestra que si la continuación "escapa" a continuación, que todavía también funciona:
AssertEqual(Eval("(call/cc (lambda (k) k))", <some continuation>);
Pero, por supuesto, lo anterior sería simplemente probar que "tengo una continuación" ... no es que en realidad es una continuación válida.
Todos los ejemplos que puedo encontrar, sin embargo, siempre terminan usando "set!" para demostrar la continuación escapada.
¿Cuál es el ejemplo de esquema más simple que demuestra un soporte adecuado para las continuidades hacia atrás sin depender de la mutación?
¿Las continuación hacia atrás se usan sin mutación? Estoy comenzando a sospechar que no lo son, porque solo podrías usarlo para ejecutar exactamente el mismo cálculo de nuevo ... lo cual no tiene sentido si no hay efectos secundarios. ¿Es por eso que Haskell no tiene continuaciones?
Hey eso es estupendo! Creo ... ¡Tengo que descubrir qué demonios hace ahora! ;-) –
OK Lo entiendo ahora ... ¡Eso es muy inteligente! Y demuestra un uso real: bucle sin recursión explícita. –
Derecha. Por supuesto, cualquiera que esté familiarizado con el combinador Y le dirá que no necesita continuación para eso, pero tal vez yo pueda llegar a algo que no sea tan obvio. –