2015-12-28 2 views
0

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

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

Там нет предопределенного способа сделать это, но вы можете иметь препроцессор удалить директиву во время компиляции.

Для проверки типов примитивов, лучший, что вы можете сделать, это предобработку его в нечто вроде

#install_printer some_function

к

let _ = (some_function:Format.formatter -> 'a -> unit)

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, затем можно загрузить project- локальная библиотека foo и ее зависимости с использованием #require "foo".

+0

Ваш совет - как обычно :) - очень ценный Мартин, это должен быть принятый ответ! –

Смежные вопросы