在 SML 中构建库

Structuring a Library in SML

我目前正在用标准 ML 构建一个测试库(使用 Poly/ML 作为解释器)。我有以下目录结构:

project/a.sml
project/src/b.sml
project/src/c.sml
...

其中 a.sml 只是一堆要使用的调用

use "src/b.sml"
use "src/c.sml"
...

b.sml,c.sml等都是这样的结构定义

structure ComponentX
struct
...
end

它们构成了很好的、逻辑上独立的库组件。我有时也会在一个文件中创建一个模块,然后在另一个文件中的同一模块中引入子结构。

然后我可以通过调用 use "a.sml".

在项目的根目录中使用测试库。

但是,我好像不能使用自己目录之外的代码,这有点问题。例如,假设我在 project 的父目录中。如果我随后调用 use "project/a.sml",随后对 use "src/x.sml" 的调用将尝试在父目录(不存在)中找到 src 目录。

有没有什么方法可以做一个相对的use,或者有没有更好的方法来构建它?

Poly/ML 中的 use 函数本身在递归使用时不会更改路径。您将需要使用 OS.FileSys.chDir 显式更改子目录中的路径。 use 只是一个函数,因此您可以根据需要重新定义它。 OS.PathOS.FileSys 结构可能很有用。

另一种方法是重新组织您的代码以利用 PolyML.make。您必须重命名文件以匹配每个文件包含的结构名称,例如ComponentX.sml 将包含结构 ComponentX。有关更多信息,请参阅 polyml.org/documentation/Reference/PolyMLMake.html or a 关于 Poly/ML 嵌套目录结构。