作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 dune
的 OCaml 项目
按照基本教程中的建议,我有一个目录结构,如:
bin/
cli.ml
dune
lib/
dune
...
<various>.ml
我的
lib
中的文件数dir 正在增长,我想要另一个级别的命名空间。
lib/
utils/
dune
...
<various>.ml
some_other_domain/
dune
...
<various>.ml
dune
...
<various>.ml
我希望能够像
Lib.Utils.Whatever
一样打开它们
dune
lib/utils
下的文件像:
(library
(name utils)
(libraries ...))
...但是
open Lib.Utils.Whatever
似乎不起作用。
subdir
stanza ...但是如果我将其添加到
lib/dune
并定义
utils
作为子目录
library
那么我没有得到命名空间...我必须
open Utils
而不是
open Lib.Utils
最佳答案
将它们称为“嵌套库”实际上有点奇怪,因为您想用 Lib.Utils.Whatever
调用它们。 . Utils
,这里是 Lib
的子模块.如果它可以帮助您,这就是我能够做的:
.
├── bin
│ ├── cli.ml
│ └── dune
├── dune-project
├── lib
│ ├── dune
│ ├── lib.ml
│ ├── suba
│ │ └── suba.ml
│ └── subb
│ └── subb.ml
和
bin/cli.ml
let () =
Lib.Suba.a ();
Lib.Subb.b ()
bin/dune
(executable
(name cli)
(libraries lib)
)
lib/dune
(include_subdirs unqualified)
(library
(name lib)
(modules suba subb)
)
(如果你像这样包含你的模块,你必须使用这些确切的名称,另一种获得控制权的方法是添加以下文件并删除
(modules suba subb)
行:
lib/lib.ml
(* here you can give the name you want -- say A -- and use it in bin with Lib.A *)
module Suba = Suba
module Subb = Subb
(总结:
dune
文件包含 (modules suba subb)
(modules ...)
中。节或编译器将无法使用它们lib.ml
module MyName = AModule
中应包含您要导出的每个模块的文件(并且只有您要导出的那些)lib.ml
中。文件,编译器将在需要时使用它们sub{a|b}/{a|b}.ml
let {a|b} () = Format.eprintf "{A|B}@."
suba.ml
和
subb.ml
用作
lib
的子模块并且可以与
Lib.Suba.a()
一起使用正如您在
cli.ml
中看到的那样
.
├── bin
│ ├── cli.ml
│ └── dune
├── dune-project
├── lib
│ ├── dune
│ ├── lib.ml
│ ├── suba
│ │ └── lib.ml
│ └── subb
│ └── lib.ml
因为
(include_subdirs unqualified)
会让它看起来像
.
├── bin
│ ├── cli.ml
│ └── dune
├── dune-project
├── lib
│ ├── dune
│ ├── lib.ml
│ ├── lib.ml
| └── lib.ml
和
dune
将无法知道哪个
lib.ml
要使用的文件。
dune
lib
根目录下的文件并为每个子目录创建一个:
.
├── bin
│ ├── cli.ml
│ └── dune
├── dune-project
├── lib
│ ├── suba
│ │ ├── dune
│ │ └── suba.ml
│ └── subb
│ ├── dune
│ └── subb.ml
唯一的变化是:
bin/cli.ml
let () =
Suba.a (); (* no more Lib.(...) *)
Subb.b ()
bin/dune
(executable
(name cli)
(libraries suba subb)
)
lib/dune
已被删除
lib/sub{a|b}/dune
(library
(name sub{a|b})
)
在这种情况下,不同目录中的多个文件可以具有相同的名称。
关于ocaml - 如何拥有嵌套库?对沙丘等感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67462284/
我是一名优秀的程序员,十分优秀!