Вставить директиву верхнего уровня в мл файлов

Я мог бы думать о верхнем уровне неправильно. Каков предпочтительный способ поддерживать коллекцию директив верхнего уровня как часть проекта?

Есть ли способ включить директивы верхнего уровня, такие как #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)

Другие вопросы по тегам