En el lenguaje de programación informática Scheme , la subrutina o función call-with-current-continuation , abreviada call/cc , se utiliza como operador de flujo de control . Ha sido adoptado por varios otros lenguajes de programación.
Tomando una función f
como su único argumento, (call/cc f)
dentro de una expresión se aplica a la continuación actual de la expresión. Por ejemplo ((call/cc f) e2)
es equivalente a aplicar f
a la continuación actual de la expresión. La continuación actual se obtiene reemplazándola (call/cc f)
por una variable c
limitada por una abstracción lambda, por lo que la continuación actual es (lambda (c) (c e2))
. Aplicarle la función f
da el resultado final (f (lambda (c) (c e2)))
.
Como ejemplo complementario, en una expresión (e1 (call/cc f))
, la continuación de la subexpresión (call/cc f)
es (lambda (c) (e1 c))
, por lo que la expresión completa es equivalente a (f (lambda (c) (e1 c)))
. En otras palabras, toma una "instantánea" del contexto de control actual o del estado de control del programa como un objeto y se aplica f
a él. El objeto de continuación es un valor de primera clase y se representa como una función, con la aplicación de función como su única operación. Cuando se aplica un objeto de continuación a un argumento, la continuación existente se elimina y la continuación aplicada se restaura en su lugar, de modo que el flujo del programa continuará en el punto en el que se capturó la continuación y el argumento de la continuación .luego se convierte en el "valor de retorno" de la invocación call/cc. Las continuaciones creadas con call/cc pueden llamarse más de una vez, e incluso desde fuera de la extensión dinámica de la aplicación call/cc.
En informática, hacer que este tipo de estado de programa implícito sea visible como un objeto se denomina cosificación . ( Scheme no distingue sintácticamente entre aplicar continuaciones o funciones).
Con call/cc, se puede implementar una variedad de operadores de control complejos desde otros lenguajes a través de unas pocas líneas de código, por ejemplo, el operador de McCarthy para elección no determinista , retroceso estilo Prolog , corrutinas estilo Simula 67 y generalizaciones de las mismas, estilo Icon generadores , o motores y subprocesos o incluso el oscuro COMEFROM [ cita requerida ] .amb
Como se muestra en el siguiente ejemplo, call/cc se puede usar para emular la función de la declaración de devolución conocida de los lenguajes de estilo C , que falta en Scheme :