Синтаксическая ошибка OCaml shebang

$ cat hello.ml 
#!/usr/bin/env ocamlrun ocaml

let rec main = print_string "Hello World!\n"

$ ./hello.ml 
Hello World!

$ ocaml hello.ml 
Hello World!

$ ocamlc -o hello hello.ml 
File "hello.ml", line 1, characters 0-1:
Error: Syntax error

$ ocamlopt -o hello hello.ml 
File "hello.ml", line 1, characters 0-1:
Error: Syntax error

Подобно Erlang, OCaml разрешает шебанги в режиме сценариев, но не работает в скомпилированном режиме. Есть ли в OCaml более идиоматический шебанг, который не вызывает синтаксическую ошибку во время компиляции?


person mcandre    schedule 29.09.2011    source источник


Ответы (2)


Просто используйте sed в качестве препроцессора. Чтобы удалить шебанг в первой строке, если он найден, выполните:

-pp 'sed "1 s/^#\!.*$//"'

to ocamlc or ocamlopt.

person Community    schedule 30.09.2011
comment
Спасибо. Я бы не хотел, чтобы пользователи OCaml использовали специальные флаги компиляции только для обработки строк shebang, но я рад, что вы заставили это работать. - person mcandre; 02.10.2011
comment
Было бы круто, если бы компиляторы автоматически убирали шебанг. Может быть, запрос на улучшение. - person ; 02.10.2011
comment
Не могли бы вы спросить их? Вы более осведомлены, поэтому они с большей вероятностью будут слушать вас. - person mcandre; 02.10.2011

Насколько я знаю, не существует директивы, которая работает как с компилятором верхнего уровня, так и с компилятором OCaml, но вы можете использовать ocamlscript в качестве промежуточного варианта.

http://martin.jambon.free.fr/ocamlscript.html

ocamlscript использует ocamlfind + ocamlopt в фоновом режиме для (повторной) компиляции вашего кода при его выполнении. С установленным ocamlscript вы можете использовать:

#!/usr/bin/env ocamlscript

Это не дает вам прямой совместимости верхнего уровня, но позволяет избежать отдельного этапа компиляции многих программ. На веб-сайте есть достойная документация и примеры.

person hcarty    schedule 29.09.2011
comment
Ба, ocamlscript не компилируется в Mac OS X. Ошибка: не удалось найти ocamlfind. - person mcandre; 29.09.2011
comment
У вас установлен ocamlfind? Это требуется ocamlscript. - person hcarty; 29.09.2011
comment
Пожалуйста, убедитесь, что у вас есть ocamlfind, который является стандартным для OCaml и всегда должен быть у вас. Я использую ocamlscript на Mac все время без проблем. - person Ashish Agarwal; 29.09.2011
comment
Спасибо. Кстати, ocamlfind не устанавливается на Mac OS X, так что я свяжусь с автором по этому поводу. - person mcandre; 29.09.2011
comment
У меня никогда не было проблем с компиляцией ocamlfind в OS X. Возможно, вы захотите попробовать маршрут ./configure && make && sudo make install. - person ; 01.10.2011
comment
Репозиторий ocamlfind не строится с помощью ./configure && make && sudo make install, потому что сначала нужно собрать документы. Я переключился с репозитория на tarball и все заработало. - person mcandre; 02.10.2011