6

Supongo que la diferencia entre delimited y undelimited continuaciones es como la diferencia entre call y jump.Diferencia entre continuaciones delimitadas y no limitadas

Si invocamos delimited continuación, volverá a la persona que llama una vez que termine. Si invocamos la continuación de undelimited, funciona como goto y nunca regresa a la persona que llama.

¿Tiene sentido? ¿Me estoy perdiendo de algo?

Respuesta

7

Está un poco fuera de lugar. Las continuas, de cualquier sabor, no tienen mucho que ver con goto (saltos). Sin embargo, tienen todo que ver con la pila.


clásico continuaciones

Recuerde continuaciones regulares capturan la noción de una pila de control como valores de primera clase. Las pilas se pueden nombrar, pasar como argumentos y se les pueden aplicar valores, lo que produce un cambio en el flujo de control, con una API simple basada en la aplicación de función a través del callCC.

delimitado continuaciones

¿Qué delimitados continuaciones añaden a la mezcla?

Recuerde que las continuaciones regulares capturan la pila de llamadas completa hasta cierto punto. ¿Qué pasaría si pudiéramos poner marcadores que digan exactamente cuánto de la pila de control capturar en la continuación? Una especie de "delimitación" de la pila de control.

Esa es la idea, y ahora tiene continuaciones delimitadas súper geniales: delimite, capture y manipule porciones arbitrarias de un programa, como un valor. Perfecto para la reanudación y el procesamiento incremental, y otras formas complicadas de flujo de control.

Referencias

Notas

Algunas correcciones de Oleg Kiselyov, recibieron fuera de la lista:

+1

En 'J', vea Danvy, Shan y Zerny's" J es para JavaScript: una correspondencia de estilo directo entre lenguajes tipo Algol y JavaScript usando continuaciones de primera clase ": http: //www.cs.rutgers. edu/~ ccshan/j/dsz.pdf – sclv

2

Las continuas como característica de idioma (en oposición a las continuaciones como un patrón de programación) son reificaciones de (partes de) el contexto de control ("la pila"). Como dijo Don, las continuaciones no delimitadas representan todo el contexto, mientras que las continuaciones delimitadas solo representan una parte de él.

Normalmente, la captura de una continuación no delimitada (por ejemplo, con call/cc) no cambia el contexto de control; el contexto de control solo cambia cuando se invoca la continuación (es decir, se refleja en la pila).

Típicamente, la captura de una continuación delimitado (por ejemplo, con shift) aborta inmediatamente el segmento del contexto de control hasta el delimitador más cercano (por ejemplo, reset) y reifica que a medida que lo que parece ser una función simple y llano (aunque podría implementarse como trucos de pila en lugar de implementar funciones normales).

BTW, las continuaciones a veces se llaman "saltos de primera clase", pero eso no significa que tengan más que ver con la instrucción jmp que una llamada de función normal.