使用 Poly/ML 构建具有嵌套目录结构的项目
Using Poly/ML to build projects with nested directory structures
到目前为止,我一直在使用 Poly/ML 进行几个所有源代码文件都在同一目录中的小项目。要构建这些项目,我所要做的就是 运行 在 REPL 中执行以下命令:
> PolyML.make "Main";
但现在我有一个项目,其规模使得将所有源代码文件放在同一个目录中是不切实际的。要在 REPL 中构建这些项目,我需要 运行 以下命令:
> PolyML.make "foo/Foo";
> PolyML.make "bar/Bar";
> PolyML.make "qux/Qux";
> PolyML.make "Main";
随着子系统数量的增加,这并不是很实用。
在 Poly/ML 中是否有任何方法可以自动构建具有嵌套目录结构的项目?
P.D.: 我看过 SML/NJ 的 Compilation Manager 和 MLton 的 ML Basis 系统。虽然功能强大,但对我的需求来说太复杂了。
您可以有一个 build.sml
文件列表和 use
-ing 所有项目文件:
use "bar/bar.sml";
use "foo/foo.sml";
use "main.sml";
或者,更简洁一点:
app use [
"foo/foo.sml",
"bar/bar.sml",
"main.sml"
]
其中 app
是标准 List.app
。
然后你可以只构建这个文件:
$ polyc -o main main.sml
$ # or
$ poly
> PolyML.make "build.sml"
在每个子目录中放置一个名为 ml_bind.ML 的文件,并让这些文件为该目录构建组件。
PolyML.make 期望源文件的名称与组件(结构、签名或函子)的名称相匹配。因此,如果它正在寻找名为 "Foo" 的结构,它会在名为 "Foo"、"Foo.ML" 或 "Foo.sml" 的文件中寻找 "Foo" 的源代码。相反,如果它找到一个名为 "Foo" 的目录,它会递归地进入 "Foo" 目录并使用 "ml_bind.ML" 文件作为构建 "Foo" 结构的指南。通常,"Foo/ml_bind.ML" 看起来像
structure Foo = FooFunctor(structure A = FooA and B = FooB);
文件 "Foo/FooFunctor.ML"、"Foo/FooA.ML" 和 "Foo/FooB.ML" 分别包含 "FooFunctor"、"FooA" 和 "FooB" 的源代码。
您可以在作为 Poly/ML 源代码分发的一部分的 Poly/ML 编译器的代码中找到这方面的示例。
到目前为止,我一直在使用 Poly/ML 进行几个所有源代码文件都在同一目录中的小项目。要构建这些项目,我所要做的就是 运行 在 REPL 中执行以下命令:
> PolyML.make "Main";
但现在我有一个项目,其规模使得将所有源代码文件放在同一个目录中是不切实际的。要在 REPL 中构建这些项目,我需要 运行 以下命令:
> PolyML.make "foo/Foo";
> PolyML.make "bar/Bar";
> PolyML.make "qux/Qux";
> PolyML.make "Main";
随着子系统数量的增加,这并不是很实用。
在 Poly/ML 中是否有任何方法可以自动构建具有嵌套目录结构的项目?
P.D.: 我看过 SML/NJ 的 Compilation Manager 和 MLton 的 ML Basis 系统。虽然功能强大,但对我的需求来说太复杂了。
您可以有一个 build.sml
文件列表和 use
-ing 所有项目文件:
use "bar/bar.sml";
use "foo/foo.sml";
use "main.sml";
或者,更简洁一点:
app use [
"foo/foo.sml",
"bar/bar.sml",
"main.sml"
]
其中 app
是标准 List.app
。
然后你可以只构建这个文件:
$ polyc -o main main.sml
$ # or
$ poly
> PolyML.make "build.sml"
在每个子目录中放置一个名为 ml_bind.ML 的文件,并让这些文件为该目录构建组件。
PolyML.make 期望源文件的名称与组件(结构、签名或函子)的名称相匹配。因此,如果它正在寻找名为 "Foo" 的结构,它会在名为 "Foo"、"Foo.ML" 或 "Foo.sml" 的文件中寻找 "Foo" 的源代码。相反,如果它找到一个名为 "Foo" 的目录,它会递归地进入 "Foo" 目录并使用 "ml_bind.ML" 文件作为构建 "Foo" 结构的指南。通常,"Foo/ml_bind.ML" 看起来像
structure Foo = FooFunctor(structure A = FooA and B = FooB);
文件 "Foo/FooFunctor.ML"、"Foo/FooA.ML" 和 "Foo/FooB.ML" 分别包含 "FooFunctor"、"FooA" 和 "FooB" 的源代码。
您可以在作为 Poly/ML 源代码分发的一部分的 Poly/ML 编译器的代码中找到这方面的示例。