2012-02-05 11 views
5

Mi carpeta contiene varios archivos, que se compilan en este orden: global.ml, zone.ml, abs.ml, main.mlDeclaraciones y variables de referencia a nivel mundial para varios archivos

global.ml contiene algunas variables de referencia (por ejemplo let g1 = ref 0) para todos los archivos.

En zone.ml hay una declaración let f = !g1.

En abs.ml, no es g1 := 5, que será dirigido por main en el comienzo del tiempo de ejecución, lo considero como una inicialización de g1 dado el contexto en tiempo de ejecución real.

Más tarde main llamará al Zone.f. Curiosamente, me doy cuenta es que toma f = 0 en lugar de f = 5.

¿Crees que este comportamiento es normal? Si es así, ¿qué debo cambiar para que tome en cuenta el valor actual de !g1?

PS: Tal vez una solución consiste en hacer una función let f v = v en zone.ml luego dejar main llamada Zone.f !g1. Pero tengo varias variables de referencia globales como g1 en global.ml, espero que puedan ser válidas sobre todos los archivos y funciones, y no quiero involucrarlos en la firma de una función.

Respuesta

6

Le preocupa básicamente el orden de evaluación de los valores de nivel superior en sus módulos. El orden en el que esto sucede no está relacionado con el orden en que compila los archivos, sino más bien el orden en que aparecen cuando vincula los archivos.

Si ignora los límites de módulo, si enlaza los archivos en el orden que se da, lo que tienes es la siguiente:

let g1 = ref 0 
let f = !g1 
let() = g1 := 5 

no debería ser sorprendente que f tiene el valor 0.

Tenga en cuenta que su main no es necesariamente lo primero que ocurre en el tiempo de ejecución. Los valores de nivel superior se evalúan en el orden en que aparecen los archivos cuando los vincula. Muy comúnmente, main es el último cosa de alto nivel que sucede (porque su archivo suele ser el último).

(Tenga en cuenta también que el tener un main en absoluto es sólo una convención, supuestamente adoptada por los ex programadores de C como yo. No hay necesidad de tener una función llamada main. OCaml solo evalúa los valores de nivel superior en orden.)

Editar:

es difícil decir cómo reestructurar su código sin saber más sobre ella. La esencia de su problema parece ser que usted define f como un valor inmutable de nivel superior en zone.ml pero desea que su valor siga g1, que es un valor mutable.

La sugerencia más simple sería eliminar la definición de f de zone.ml y reemplazarla en todas partes en el archivo con !g1.

Si desea conservar el nombre f en el nivel superior en zone.ml, debe redefinirlo como algo distinto de un valor inmutable. Una función es la opción más obvia:

let f() = !g1 

allí tendría que sustituir a los usos de f en zone.ml por f() lugar.

+0

Gracias por su comentario, explicó por qué sucede, pero no explicó cómo resolverlo ... No puedo cambiar el orden de compilación de estos archivos, ¿qué más puedo hacer? – SoftTimur

+0

Agregué ** Editar ** con algunas sugerencias. Pero es difícil saber qué sugerir sin saber más acerca de su código. –

Cuestiones relacionadas