namespaces - OCaml 如何修复模块名称冲突

标签 namespaces ocaml

制作顶层时,模块名称不允许与内部编译器库冲突。

有哪些解决此类模块名称冲突的策略?

理想情况下,是否可以将一些参数传递给 ocamlc指示它“修改”所有模块的名称以使用自定义前缀,如 MyProject_ ? (从 OCaml ABI 的角度来看,不是从字面上更改源文件)

完整示例如下:
Sqrt.ml包含

let sqrt x = x ** 0.5
Sqrt.mli包含
val sqrt : float -> float
mktop包含
#!/bin/bash

ocamlc -c Sqrt.mli -o Sqrt.cmi 
ocamlc -c Sqrt.ml  -o Sqrt.cmo

ocamlmktop -o sqrt_toplevel Sqrt.cmo

我可以生成一个包含我想要的功能的顶层。
% ./sqrt_toplevel
        OCaml version 4.04.0

# Sqrt.sqrt 4.5;;
- : float = 2.12132034355964239

如果我重命名 Sqrt模块到 Parse通过更改文件名,名称与内部库冲突并且顶层无法链接。
mktop就是现在
#!/bin/bash

ocamlc -c Parse.mli -o Parse.cmi 
ocamlc -c Parse.ml  -o Parse.cmo

ocamlmktop -o parse_toplevel Parse.cmo

将其他文件简单地重命名为 Parse.mlParse.mli .

如果我这样做,我会与编译器库发生命名冲突。
% ./mktop |& sed -e s:"$HOME":~:
File "Parse.cmo", line 1:
Warning 31: files Parse.cmo and ~/.opam/4.04.0/lib/ocaml/compiler-libs/ocamlcommon.cma(Parse) both define a module named Parse
File "_none_", line 1:
Error: Some fatal warnings were triggered (1 occurrences)
Exit 2

最佳答案

除了使用与内部模块不冲突的名称外,我没有看到避免此问题的书面方法。

以下是列出所有禁止名称的 Unix 命令,这至少是:

$ cd ~/.opam/4.04.0/lib/ocaml/compiler-libs
$ ocamlobjinfo ocamlbytecomp.cma ocamlcommon.cma ocamltoplevel.cma |
    awk '/^Unit name:/ { print $3}' | sort

对我来说(现在使用 OCaml 4.03.0)有 96 个被禁止的名字。我写了一个脚本来验证所有 96 是否真的被禁止。

作为旁注,尽管报告了错误,但实际上还是生成了顶层。而且,在快速测试中,它似乎有效。函数Parse.sqrt (例如)存在并计算正确的答案。但可能有一些我没有碰巧遇到的问题。

关于namespaces - OCaml 如何修复模块名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46108548/

相关文章:

c# - DispatcherTimer 需要哪个程序集?命名空间不起作用

graphics - 如何编译ocaml图形窗口cygwin

types - ocaml 类型内的类型

namespaces - Laravel:如何在包中命名帮助库?

c++ - Argument Dependent Lookup 的逆向解决方法?

带有静态成员和命名空间的 Qt tr() 翻译

ocaml - 在 OCaml 中调用其他文件中的函数

postgresql - OCaml:将数据序列化为具有附加要求的字符串

ocaml - 如何根据 Ocaml 中的条件分配值?

node.js - 编译后从 typescript 命名空间导出类给出未定义(NestJS)