Вставить директиву верхнего уровня в мл файлов
Я мог бы думать о верхнем уровне неправильно. Каков предпочтительный способ поддерживать коллекцию директив верхнего уровня как часть проекта?
Есть ли способ включить директивы верхнего уровня, такие как #install_printer
в исходном файле OCaml, чтобы они игнорировались при компиляции программы, но выполнялись на верхнем уровне при запуске?
В идеале, я бы также хотел, чтобы директивы проверялись типом при компиляции программы, даже если сама директива игнорируется, например
type 'a with_infinity = Finite of 'a | Infinite
let print_int_with_infinity pp item =
(match item with
| Infinite -> Format.pp_print_string pp "Infinite"
| Finite i -> Format.pp_print_int pp i)
(* install printer cannot occur in this context *)
#install_printer print_int_with_infinity
2 ответа
Хороший способ работы с верхним уровнем - это иметь .ocamlinit
файл в корне проекта. Этот файл загружается при запуске utop
или же ocaml
из того же каталога.
Обычно это выглядит так:
#use "topfind";; #require "this";; #require "that";; let _printer =...;; #install_printer _printer;;...
На связанной ноте, если переменная среды OCAMLPATH
установлен в /path/to/my/project:...
и есть правильное META
файл в /path/to/my/project/foo
, тогда можно загрузить локальный проект foo
библиотека и ее зависимости с помощью #require "foo"
,
Предопределенного способа сделать это не существует, но препроцессор может удалить директиву во время компиляции.
Для проверки типов примитивов лучшее, что вы можете сделать, - это предварительно обработать его как
#install_printer some_function
в
let _ = (some_function:Format.formatter -> 'a -> unit)