gpt4 book ai didi

module - 如何使用(或不使用)Oasis 制作多级模块层次结构

转载 作者:行者123 更新时间:2023-12-04 11:50:58 28 4
gpt4 key购买 nike

假设我有一组模块,每个模块都带有子模块。

M1.X        M2.X        M3.X
M1.Y M2.Y M3.Y
M1.Z M2.Z M3.Z
M1.W M2.W M3.W
M1.Q M2.Q M3.Q
M1.P M2.P M3.P

此外,我希望这些灌木中的每一个都位于一个主模块下。
Home.M1
Home.M2
Home.M3

现在,很容易为每个 M1 构建项目目录。 , M2 , 和 M3使用绿洲的 Pack:选项。特别是,我喜欢并试图解决的是 (a) 在标准 .ml 中布置我的文件的能力。/ .mli格式和 (b) 具有 ocamldoc生成正确链接的文档。

但是因为我想分发 M1 中的每一个, M2 , 和 M3在公共(public)模块层次结构下的同一个库中,我无法使用 Pack:而是被迫将整个该死的东西放入一个文件中,以便 (a) 不会意外破坏全局命名空间,(b) 不会意外地在 Home. 上扩散模块。不打算直接使用的命名空间,并且 (c) 不会破坏 ocamldoc 链接。

所以我的问题是,根据上述建议的目标,我如何使用 Oasis 创建具有这种形式的分层模块的包?

一些额外的限制包括:
  • M1. 下的模块并非偶然, M2. , 和 M3.命名空间冲突——这也发生在真实情况下!
  • M2. 中的模块和 M3.命名空间依赖于 M1. 中的模块命名空间。

  • 我的偏好将能够得出一个解决方案,该解决方案还允许合理的文件布局,例如
    src -+
    +-- m1 -+
    | +-- x.ml
    | +-- x.mli
    | +-- y.ml
    | +-- y.mli
    | +-- z.ml
    | +-- z.mli
    | |
    | ...
    |
    |
    +-- m2 -+
    | +-- x.ml
    | +-- x.mli
    | +-- y.ml
    | +-- y.mli
    | +-- z.ml
    | +-- z.mli
    | |
    | ...
    |
    |
    +-- m3 -+
    +-- x.ml
    +-- x.mli
    +-- y.ml
    +-- y.mli
    +-- z.ml
    +-- z.mli
    |
    ...

    也有可能这对 Oasis 来说是不可能的。在这种情况下,关于如何使用其他构建工具的建议是可以接受和欢迎的。假设我对其他工具知之甚少……因为这可能是真的!

    最佳答案

    有绿洲
    packoasis有点损坏,因为它通过将所有路径包含到搜索路径中来破坏命名空间。有一个长期接受的错误请求,但事情仍然存在。但是,如果它工作正常,它可以帮助你,因为它会创建一个库命名空间,允许你在不同的文件夹中拥有同名的模块。但是,它不起作用,所以我们应该忘记它。

    我们在 BAP 中采用的方法项目是用丑陋的 bap_subproject_ 来破坏所有模块名称前缀,它可以保护我们免受与我们自己的模块的冲突,以及来自外部库的冲突。对于每个 bap_subproject我们有一个文件夹,其中包含所有名称困惑的实现模块和一个总括模块来管理它们。该模块存储在文件 bap_subproject.ml 中它为要导出的所有模块和类型定义别名。通常它包含以下条目:

    module X = Bap_subproject_x

    还有一个大 Bap项目,它将所有子库联合在一个命名空间下 Bap.Std ,并重新导出它需要的所有内容,以便在一个 open Bap.Std 之后您可以访问 Insn bap_disasm/bap_disasm_insn.ml[i] 中定义的模块

    没有绿洲

    免责声明:如果您使用插件扩展此解决方案,它可能仍适用于 oasis。

    我们在一个项目中使用了这种方法,不幸的是它是封闭源代码,所以我无法提供链接。每个子项目都存在于它自己的子文件夹中,在它自己的命名空间中(我们在每个子文件夹中有 parser 模块,没有任何破坏)。每个子项目都有一个 mlpack文件,在 top文件夹:
     root +
    |
    +-- expr.mlpack
    +-- expr -+
    |
    +- lexer.*
    +- parser.*
    +- ast.*
    +- ...
    +-- cameo.mlpack
    +-- cameo-+
    |
    +- lexer.*
    +- parser.*
    +- ast.*
    +- ...
    expr.mlpack的内容是:
       expr/Lexer
    expr/Parser
    expr/Ast
    ...
    ocamlbuild看到这个 expr.mlpack作为具有 Lexer 的独立模块, Parser ,等等其中定义的子模块(并且可以访问,例如 Expr.Lexer )。并且与同样具有 Lexer 的同级项目没有冲突,以及与 ocaml-libs 没有冲突或任何其他外部 Lexer , 因为 expr文件夹实际上从未包含在搜索路径中。

    如果您需要在系统中添加另一层,例如一个包一个包,那么您有三个选择:
  • 递归地使用相同的方法,即创建另一个 super 文件夹,它有 mlpackmllib指向子文件夹的文件。
  • 只需添加 big.mlpack引用所有顶层 mlpack 'ed 模块
  • 创建 big.ml重新引入所有模块。

  • 最后两种方法当然需要顶级打包模块具有不同的名称。但通常这是足够公平的。

    关于module - 如何使用(或不使用)Oasis 制作多级模块层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28722704/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com