【问题标题】:Using Poly/ML to build projects with nested directory structures使用 Poly/ML 构建具有嵌套目录结构的项目
【发布时间】:2015-06-01 16:12:06
【问题描述】:

到目前为止,我一直在将 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 build-automation sml polyml


    【解决方案1】:

    在每个子目录中放置一个名为 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 源代码分发的一部分。

    【讨论】:

    【解决方案2】:

    您可以有一个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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2016-01-28
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      相关资源
      最近更新 更多