Open Module_name выдает ошибку компилятора - PullRequest
0 голосов
/ 28 июня 2011

Я не могу скомпилировать чрезвычайно простую программу ocaml test2.ml

open Test1

print_string " Hello "

с test1.ml, содержащим только 1 строку

type program = string

И test1.ml компилируется:

bash-3.2$ ocamlc test1.ml
bash-3.2$ ls test1.*
test1.cmi   test1.cmo   test1.ml

Кто-нибудь знает, почему test1.ml не компилируется ?? Спасибо.

Подробнее. Это довольно странно, потому что test2.ml компилируется, если я закомментирую первую строку "open ..." ИЛИ если я закомментирую третью строку "print_string ...", но они не могут сосуществовать!

1 Ответ

5 голосов
/ 28 июня 2011

Распечатка полученной вами ошибки была бы полезной.Для справки:

File "test2.ml", line 3, characters 0-12:
Error: Syntax error

Причина этого немного сложна.Обычный синтаксис для файла - это последовательность операторов верхнего уровня, таких как определения типов, let (без in), определение модуля / открытие / включение и т. Д.

Такие выражения, как print_string "Hello", никогда не обрабатываются как операторы верхнего уровня, если их значение не является полностью однозначным, что в 99% случаев подразумевает их отделение от предыдущего и следующего операторов с помощью ;;

Итак, вы можете написать следующее:

open Test1 ;;
print_string " Hello "

И это сработает.Тем не менее, в большинстве случаев желательно поддерживать чистоту файла, превратив выражение в верхний уровень let:

open Test1
let () = print_string " Hello "

Это также имеет преимущество, заключающееся в том, что функция возвращает unit, что всегда приятно иметь.

...