Beim Erstellen einer Toplevel dürfen Modulnamen nicht mit internen Compiler-Bibliotheken in Konflikt geraten.OCaml wie man Modulnamen kollidiert
Was sind einige Strategien zur Behebung dieser Art von Modulnamen Kollisionen?
Idealerweise ist es möglich, ein Argument an ocamlc
zu übergeben, um es anzuweisen, die Namen aller Module zu "zerlegen", um ein benutzerdefiniertes Präfix wie MyProject_
zu verwenden? (Aus der Perspektive des OCaml ABI, nicht wörtlich zu ändern Quelldateien)
Voll Beispiel unten:
Sqrt.ml
enthält
let sqrt x = x ** 0.5
Sqrt.mli
enthält
val sqrt : float -> float
mktop
enthält
#!/bin/bash
ocamlc -c Sqrt.mli -o Sqrt.cmi
ocamlc -c Sqrt.ml -o Sqrt.cmo
ocamlmktop -o sqrt_toplevel Sqrt.cmo
Und ich kann eine Toplevel mit der gewünschten Funktion produzieren.
% ./sqrt_toplevel
OCaml version 4.04.0
# Sqrt.sqrt 4.5;;
- : float = 2.12132034355964239
Wenn ich das Sqrt
Modul Parse
durch Ändern der Dateinamen umzubenennen, die Namenskonflikte mit einer internen Bibliothek und die Top-Level-Verbindung herstellen kann.
mktop
ist jetzt
#!/bin/bash
ocamlc -c Parse.mli -o Parse.cmi
ocamlc -c Parse.ml -o Parse.cmo
ocamlmktop -o parse_toplevel Parse.cmo
mit den anderen Dateien einfach umbenannt Parse.ml
und Parse.mli
.
Wenn ich dies tue, bekomme ich einen Namenskonflikt mit einem Compiler-Lib.
% ./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