【发布时间】:2017-09-08 04:15:51
【问题描述】:
制作顶层时,模块名称不允许与内部编译器库冲突。
有哪些解决此类模块名称冲突的策略?
理想情况下,是否可以将一些参数传递给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.ml 和Parse.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
【问题讨论】:
标签: namespaces ocaml