首页 > 解决方案 > 如何使用相对于导入器的路径从 SML 中的另一个文件导入?

问题描述

我正在使用 SML/NJ,我需要使用一组函数,这些函数f1.sml位于另一个文件中的某个文件中f2.sml

但是,我不是f2.sml直接运行,而是从其他地方导入它。

如果我将use命令与相对于透视图f2.sml的路径一起使用,则在我 import时,它将从运行脚本透视图查找提供的路径。f1.smlf2.smlf2.sml

我不能使用绝对路径,我不想合并这两个文件的内容。

抱歉,如果这是该语言的一个微不足道的应用程序,但我是 SML 的新手,还找不到答案。

标签: smlsmlnj

解决方案


我推荐使用SML/NJ 的编译管理器(CM)。它是 SML/NJ 上下文中 SML 代码的构建系统。如果您需要更高级的功能,它可能会变得相当复杂,但它很容易上手。我将向您展示一个准系统结构,您可以根据需要进行调整。它已经随 SML/NJ 一起安装,因此没有安装过程。

我将在此示例中使用以下目录结构(不强制文件扩展名,只是一个约定):

.
├── build.cm
└── src
    ├── foo.fun
    ├── foo.sig
    └── main.sml

构建.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

推荐阅读