Как импортировать из другого файла в SML, с указанием пути относительно импортера? - PullRequest
0 голосов
/ 30 мая 2018

Я использую SML / NJ, и мне нужно использовать набор функций, которые находятся в определенном файле f1.sml внутри другого файла f2.sml.

Однако я не работаю f2.sml напрямую, скорее, я импортирую его откуда-то еще.

Если я использую команду use в f2.sml с путем к f1.sml относительно перспективы f2.sml, к тому времениЯ импортирую f2.sml, он будет искать указанный путь с точки зрения запущенного скрипта.

Я не могу использовать абсолютные пути, и я не хотел бы объединять содержимое двух файлов.

Извините, если это простое применение языка, но я новичок в SML и пока не могу найти ответ.

1 Ответ

0 голосов
/ 30 мая 2018

Я рекомендую использовать 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
...