2011-03-27 14 views
7

Tuve un pequeño problema al implementar arreglos en ocaml. Por ejemplo, cuando en el terminal (Konsole) y de tipo IImplementación de Ocaml

let tab = Array.make 5 6; 

tengo

val tab : int array = [|6; 6; 6; 6; 6|] 

como una salida. Entonces crea una matriz con una longitud de 5 y llena todos los casos con 6. Está bien, entiendo esa parte. Pero cuando lo escribo en un editor de texto como Kate por ejemplo, guardarlo y compilarlo que me sale este error:

Error: Unbound value Array.make 

No entiendo por qué se toma la matriz. hacer como valor en kate y toma Array.make como una función en la terminal. Guardé el archivo con la extensión ".ml" y lo compilé usando ocamlc -o test name_of_file. ¿Alguna sugerencia por favor? Gracias.

Respuesta

5

He compilado su programa con ocamlc y ha ido bien (utilizando OCaml 3.12.0).

Supongo que está llamando a una versión anterior del compilador cuando intenta compilar, quizás una cuando Array.make todavía se llamaba Array.create. Quizás cuando instaló la nueva versión, sobrescribió algunos de los archivos (como el toplevel) pero no otros (como el compilador). Para verificar, compare las versiones dadas por ocamlc -v y ocaml.

En cuanto al mensaje "Valor sin consolidar", en OCaml, las funciones son valores. Los implementadores no diferenciaron entre "Valor sin consolidar que no es una función" y "Valor sin consolidar que es una función", pero esta no es la causa del problema. La causa de su problema es que Array.make está desatado.

+0

Ambos me dieron la misma versión. Versión 3.11.2. No creo que haya sobrescrito ningún archivo perteneciente a una versión anterior. Acabo de instalar Linux en mi pc, así que no tenía una versión anterior de ocaml. Lo verifiqué simplemente escribiendo ocaml y escribió que ocaml aún no está instalado, así que simplemente lo instalé ... esta versión 3.11.2. Intenté Array.create pero todavía tengo el mismo problema. ¿Crees que es por la versión que estoy usando? – mkab

+0

@mktab Definitivamente debería funcionar con la versión 3.11.2. La versión 3.12.0 le diría si se trata de un módulo 'Array' o una función' make' contenida en él, una de las muchas pequeñas mejoras que aporta esta versión, pero el error que está recibiendo sigue siendo un misterio. –

+2

@mktab Es probable que el compilador no encuentre el archivo .../lib/ocaml/array.cmi. Tal vez falta, o el paquete de su distribución se preparó incorrectamente copiando archivos en un destino diferente al configurado para ser instalado en el compilador. Si es el caso, puede solucionarlo usando las opciones -I y -L, pero recomendaría volver a compilar OCaml de las fuentes. –

3

Encontré el error. Es muy estúpido. Guardé mi archivo como "array.ml". Así que durante la compilación creó un archivo array.cmi y creo que confundió un poco este archivo con el que se encuentra en .../lib/ocaml/array.cmi. No estoy realmente seguro. Así que cambié el nombre del archivo a "table.ml" y se compiló perfectamente. Es una locura que haya confundido estos dos archivos

+0

¿Cómo especificar explícitamente '../ lib/ocaml/array.cmi' luego? – updogliu