Pregunta

He leído en algún lugar donde dijo rica Hickey:

  

"Creo continuaciones podrían estar ordenado   en teoría, pero no en la práctica "

No estoy familiarizado con clojure.
1. ¿clojure tienen continuaciones?
2. Si no, no necesita usted continuaciones? He visto un montón de buenos ejemplos especialmente de este tipo . ¿Cuál es la alternativa?
3. En caso afirmativo, ¿existe una documentación?

¿Fue útil?

Solución

Cuando se habla de continuaciones, que tendrá que distinguir entre dos tipos diferentes de ellos:

  • continuaciones de primera clase - continuación de soporte que está profundamente integrado en el lenguaje (Esquema o Ruby). Clojure no soporta continuaciones de primera clase.

  • Continuación de paso de estilo (CPS) - CPS es sólo un estilo de codificación y cualquier lenguaje de apoyo a las funciones anónimas permitirá a este estilo (que se aplica a Clojure también)

  • .

Ejemplos:

-- Standard function
double :: Int -> Int
double x = 2 * x

-- CPS-function – We pass the continuation explicitly
doubleCPS :: Int -> (Int -> res) -> res
doubleCPS x cont = cont (2 * x)
; Call
print (double 2)

; Call CPS: Continue execution with specified anonymous function
double 2 (\res -> print res)

continuación en la Wikipedia.

no creo que continuaciones son necesarios para un buen lenguaje, pero especialmente continuaciones de primera clase y CPS en los lenguajes funcionales como Haskell puede ser bastante útil ( inteligente ejemplo backtracking ).

Otros consejos

He escrito un puerto Clojure de CL-cont continuaciones que se suma a Common Lisp.

https://github.com/swannodette/delimc

  

es continuación una característica necesaria en un idioma?

No. Un montón de lenguas no tienen continuaciones.

  

Si no, ¿NO necesita continuaciones? He visto un montón de buenos ejemplos especialmente de este tipo. ¿Cuál es la alternativa?

Una pila de llamadas

Extracto continuaciones

Las continuaciones son una noción abstracta que se utiliza para describir la semántica de control de flujo. En este sentido, ambos existen y no existen (recordemos, son abstractos) en cualquier idioma que se ofrece a los operadores de control (como cualquier lenguaje Turing completo debe), de la misma manera que existen los números de ambos (como entidades abstractas) y no existen (como entidades tangibles).

Las continuaciones describen los efectos de control, como la función de llamada / retorno, manejo de excepciones, e incluso los goto. Un lenguaje bien fundada será, entre otras cosas, se ha diseñado con abstracciones que se basan en las continuaciones (por ejemplo, excepciones). (Es decir, un lenguaje bien fundada constará de los operadores de control que fueron diseñados con continuaciones en mente. Es, por supuesto, perfectamente razonable para un lenguaje para exponer continuaciones como el solamente abstracción de control , lo que permite a los usuarios crear sus propias abstracciones en la parte superior.)

Primera Clase continuaciones

Si la noción de una continuación es href="https://en.wikipedia.org/wiki/Reification_(computer_science)" cosificado como un objeto de primera clase en un idioma, entonces tenemos una herramienta en la que todo tipo de efectos de control se pueden construir. Por ejemplo, si una lengua tiene continuaciones de primera clase, pero no excepciones, podemos construir excepciones en la parte superior de continuaciones.

Problemas con continuaciones de primera clase

Mientras continuaciones de primera clase son una herramienta poderosa y útil en muchos casos, también hay algunas desventajas para exponerlos en un idioma:

  • Los diferentes abstracciones construidas en la parte superior de las continuaciones pueden dar lugar a un comportamiento inesperado / intuitivo cuando está compuesta. Por ejemplo, un bloque finally podría ser omitido si uso una continuación para abortar un cálculo.
  • Si la continuación actual puede ser solicitada en cualquier momento, entonces el lenguaje de tiempo de ejecución debe estar estructurado de manera que es posible producir alguna representación de estructuras de datos de la continuación actual en cualquier momento. Esto coloca un cierto grado de carga para el tiempo de ejecución de una función que, para mejor o peor, a menudo se considera "exótico". Si el idioma está instalado (como Clojure está alojado en la JVM), luego de que la representación debe ser capaz de encajar dentro del marco proporcionado por la plataforma de alojamiento. También puede haber otras características un lenguaje desea mantener (por ejemplo, C de interoperabilidad) que restringen el espacio de soluciones. Cuestiones como éstas aumentan el potencial de una "falta de coincidencia de impedancia", y pueden complicar gravemente el desarrollo de una solución performant.

Adición de primera clase continuaciones de un idioma

A través de metaprogramming, es posible añadir soporte para las continuaciones de primera clase a un idioma. Generalmente, este enfoque implica la transformación de código de estilo de continuación de paso (CPS), en la que se pasa la continuación de corriente alrededor como un argumento explícito para cada función.

Por ejemplo, delimc implementos biblioteca de David Nolen delimitada continuaciones de porciones de un programa Clojure a través de una serie de transformadas de macro. En una línea similar, he escrito pulley.cps , que es un compilador macro que transforma código en CPS, junto con una biblioteca en tiempo de ejecución para apoyar más características fundamentales Clojure (tales como el manejo de excepciones), así como de interoperabilidad con código Clojure nativo.

Un problema con este enfoque es cómo manejar el límite entre código nativo (Clojure) y se transforma código (CPS). En concreto, ya que no puede capturar la continuación de código nativo, es necesario o bien no permitir (o de alguna manera restringir) de interoperabilidad con el idioma base o una carga para el usuario de asegurar el contexto permitirá a cualquier continuación desean capturar a realidad ser capturado.

polea.cps tiende hacia este último, aunque se han hecho algunos intentos para permitir al usuario manejar esto. Por ejemplo, es posible para no permitir código de CPS para poner en código nativo. Además, se proporciona un mecanismo para suministrar versiones de CPS de funciones nativas existentes.

En una lengua con un sistema de tipo suficientemente fuerte (como Haskell), es posible utilizar el sistema de tipos para encapsular cálculos que podría utilizar las operaciones de control (es decir, continuaciones) de código funcionalmente puro.

Resumen

Ahora tenemos la información necesaria para responder directamente a sus tres preguntas:

  1. Clojure no soporta continuaciones de primera clase, debido a consideraciones prácticas.
  2. Todas las lenguas están construidas sobre continuaciones en el sentido teórico, pero pocos idiomas exponen continuaciones como objetos de primera clase. Sin embargo, es posible añadir continuaciones a cualquier idioma a través de, por ejemplo, la transformación en CPS.
  3. Consulte la documentación de delimc pulley.cps .

Un uso común de las continuaciones está en la implementación de estructuras de control para: regresar de una función, partiendo de un bucle, la gestión de excepciones, etc. La mayoría de los idiomas (como Java, C ++, etc.) proporcionan estas características como parte del núcleo del lenguaje. Algunos lenguajes no lo hacen (por ejemplo: Esquema). En su lugar, estas lenguas exponen continuatiions como objetos de primera clase y permiten al programador definir nuevas estructuras de control. De este modo Esquema debe ser visto como un conjunto de herramientas de lenguaje de programación, no es un lenguaje completo en sí mismo.

En Clojure, casi nunca necesitamos usar continuaciones directamente, ya que casi todas las estructuras de control son proporcionados por la combinación de idiomas / VM. Aún así, las continuaciones de primera clase pueden ser una herramienta poderosa en manos del programador competente. Especialmente en el Esquema, continuaciones son mejores que los homólogos equivalentes en otros idiomas (como el par setjmp / longjmp en C). Este artículo tiene más detalles sobre esto.

Por cierto, será interesante saber cómo Rich Hickey justifica su opinión sobre el continuaciones. Cualquier enlace para que?

Clojure (o más bien clojure.contrib.monads) tiene una mónada continuación; aquí está un artículo que describe su uso y la motivación .

Bueno ... -> de Clojure implementa lo que está después ... Pero con una macro en lugar

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