В основном вас интересует порядок оценки значений верхнего уровня в ваших модулях.Порядок, в котором это происходит, не связан с порядком, в котором вы компилируете файлы, а скорее с порядком, в котором они появляются, когда вы связываете файлы.Если вы игнорируете границы модуля, если вы связываете файлы в указанном вами порядке, то получается следующее:
let g1 = ref 0
let f = !g1
let () = g1 := 5
Не удивительно, что f
имеет значение 0.
Обратите внимание, что ваш main
не обязательно первое, что происходит во время выполнения.Значения верхнего уровня оцениваются в том порядке, в каком файлы появляются при их связывании.Очень часто main
- это последний объект верхнего уровня (поскольку его файл обычно является последним).
(Также обратите внимание, что наличие main
вообщепросто соглашение, предположительно принятое бывшими программистами Си, такими как я. Нет необходимости иметь функцию с именем main
. OCaml просто оценивает значения верхнего уровня по порядку.)
Edit:
Трудно сказать, как реструктурировать ваш код, не зная об этом больше.Суть вашей проблемы в том, что вы определяете f
как неизменное значение верхнего уровня в zone.ml
, но вы хотите, чтобы его значение следовало за g1
, что является изменяемым значением.
Самое простоеБыло бы предложено убрать определение f
из zone.ml
и заменить его везде в файле на !g1
.
Если вы хотите сохранить имя f
на верхнем уровне в zone.ml
, вы должны переопределить его как нечто иное, чем неизменное значение.Функция является наиболее очевидным выбором:
let f () = !g1
Тогда вы бы заменили использование f
в zone.ml
на f ()
вместо.