Я рекомендую использовать SML / NJ's Compilation Manager (CM).Это система сборки для кода SML в контексте SML / NJ.Это может быть довольно сложно, если вам нужно более продвинутые функции , но это легко начать.Я покажу вам структуру barebones, и вы можете настроить по мере необходимости.Он уже установлен вместе с SML / NJ, поэтому процесс установки не выполняется.
Я буду использовать следующую структуру каталогов для этого примера (расширения файлов не применяются, просто соглашение):
.
├── build.cm
└── src
├── foo.fun
├── foo.sig
└── main.sml
build.cm
group
(* CM allows you to selectively export defined modules (structures,
signatures and functors) by listing them here. It's useful for
libraries. *)
source (-) (* export all defined modules *)
structure Main (* OR, export selectively *)
signature FOO
functor Foo
is
(* Import the SML standard library, aka Basis. *)
(* See: http://sml-family.org/Basis/ *)
$/basis.cm
(* Import the SML/NJ library *)
(* Provides extra data structures and algorithms. *)
(* See: https://www.smlnj.org/doc/smlnj-lib/Manual/toc.html *)
$/smlnj-lib.cm
(* List each source file you want to be considered for compilation. *)
src/main.sml
src/foo.sig
src/foo.fun
src / main.sml
structure Main =
struct
(* You don't have to import the `Foo` functor. *)
(* It's been done in build.cm already. *)
structure F = Foo()
fun main () =
print (F.message ^ "\n")
end
src / foo.sig
signature FOO =
sig
val message : string
end
src / foo.fun
(* You don't have to import the `FOO` signature. *)
(* It's been done in build.cm already. *)
functor Foo() : FOO =
struct
val message = "Hello, World!"
end
Использование
Имея структуру на месте, вы можете начать компилирование с использованием CM.make
и запускать, вызывая любые функции, которые вы определили:
$ sml
Standard ML of New Jersey v110.82 [built: Tue Jan 9 20:54:02 2018]
- CM.make "build.cm";
val it = true : bool
-
- Main.main ();
Hello, World!
val it = () : unit