Pregunta

He estado tratando de entender cómo Ruby bloques de trabajo, y para ello he estado tratando de implementar en C.

Una forma fácil de implementar los cierres es pasar un void* a la envolvente de la pila para el cierre/función pero Ruby bloques también parecen manejar devoluciones y romper las declaraciones del ámbito de aplicación que utiliza el bloque.

loop do
  break i if (i >= 4000)
  i *= 2
end

Creo que uno de los cierres de las propuestas de Java funciona también así.

Entonces, ¿cómo implementar Ruby-bloques/Java-cierres en C?

¿Fue útil?

Solución

El concepto de cierres requiere el concepto de contextos.C del contexto se basa en la pila y los registros de la CPU, así que para crear un bloque/cierre, usted necesita ser capaz de manipular el puntero de la pila, la correcta (y por reentrada) en el camino, y guardar/restaurar los registros como sea necesario.

La forma en que esto se hace por intérpretes o máquinas virtuales es tener un context estructura o algo similar, y no usa la pila y registros directamente.Esta estructura sigue la pista de una pila y, opcionalmente, algunos registros, si estás diseñando un registro basado en VM.Al menos, esa es la forma más sencilla de hacerlo (aunque ligeramente menos eficientes que en realidad asignación cosas correctamente).

Otros consejos

Realmente no he aplicado nada de esto, así que tome con un saco de sal.

Hay dos partes a un cierre de:el entorno de datos y el código de medio ambiente.Como usted dijo, usted probablemente puede pasar un void* manejar las referencias a los datos.Usted probablemente podría utilizar setjmp y longjmp para implementar el control no lineal de flujo de saltos que el Rubí break requiere.

Si desea cierres probablemente debería ser la programación en un lenguaje que en realidad les apoya.:-)

ACTUALIZACIÓN:Cosas interesantes que están sucediendo en Clang.Se ha fabricado un prototipo de cierre para la C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html puede ser una lectura interesante.

Hay una buena serie de diapositivas sobre Ruby Bloques como parte de los "Rieles con Pasión" curso:

Ruby_Blocks.pdf

Esto abarca la representación de un bloque, cómo se pasan los argumentos y ejecutado, y aún más en las cosas como Proc objetos.Es muy claramente explicado.

Puede ser de interés para observar cómo la JRuby chicos a cargo de estos en su análisis de Java.Echa un vistazo a la fuente en codehaus.

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