Soy nuevo en Ocaml e intento escribir una pequeña aplicación de ejemplo. Estoy usando ocamlc
versión 3.11.2 bajo Linux Ubuntu 10.04. Quiero compilar dos archivos:Compilación de varios archivos Ocaml
a.ml
b.ml
Archivo b.ml
utiliza definiciones de a.ml
. Por lo que yo entiendo, puedo usar ocamlc -c
para realizar compilación solamente. Puedo llamar al ocamlc
una vez más cuando tengo todos los archivos .cmo
para vincularlos a un ejecutable. Además, cuando compilo un archivo que usa definiciones de otro archivo, tengo que decirle al compilador en qué archivo .cmi
buscar las definiciones externas.
Así que mi idea era utilizar:
ocamlc -i -c a.ml > a.mli
ocamlc -c a.mli b.ml
ocamlc -o b a.cmo b.cmo
Las primeras obras de paso y produce archivos a.mli
y a.cmo
, pero cuando se ejecuta el segundo paso me sale
File "b.ml", line 1, characters 28-31:
Error: Unbound value foo
donde foo
es una función que se define en a.ml
y se llama en b.ml
.
Así que mi pregunta es: ¿cómo puedo compilar cada archivo fuente por separado y especificar las interfaces que se importarán en la línea de comandos? He estado buscando en la documentación y, por lo que puedo entender, debo especificar los archivos .mli
que se incluirán, pero no sé cómo.
EDITAR
Aquí algunos detalles más. a.ml
archivo contiene la definición
let foo = 5;;
archivo b.ml
contiene la expresión
print_string (string_of_int foo)^"\n";;
El ejemplo real es más grande, pero con estos archivos ya tengo el error informé anteriormente.
EDIT 2
He editado el archivo b.ml
y reemplazado con foo
A.foo
y esto funciona (foo es visible en b.ml
a pesar de que tengo otro error de compilación que no es importante para esta pregunta). Supongo que es más limpio escribir mis propios archivos .mli
explícitamente, como sugiere
¿ha abierto A en B ?, porque de lo contrario esto no tiene sentido. –
No. ¿Debo definir un módulo en A y abrirlo en B? Por el momento, todas las definiciones en A son globales (no tengo módulo). – Giorgio
Hay un módulo implícito para cada archivo OCaml. Entonces su archivo 'a.ml' define un módulo llamado' A'. –