2017-09-08 1 views
1

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 

Antwort

2

Ich sehe eine dokumentierte Art und Weise dieses Problem nicht anders als durch die Verwendung Namen zu vermeiden, die mit internen Module nicht in Konflikt.

Hier sind Unix-Befehle alle verbotenen Namen aufzulisten, die etwas zumindest:

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

Für mich gibt es 96 verbotene Namen (OCaml 4.03.0 jetzt verwenden). Ich habe ein Skript geschrieben, um zu verifizieren, dass alle 96 wirklich verboten sind.

Als Nebenkommentar wird der Toplevel tatsächlich trotz des gemeldeten Fehlers generiert. Und in einem schnellen Test scheint es zu funktionieren. Die Funktion Parse.sqrt (zum Beispiel) existiert und berechnet die richtigen Antworten. Aber möglicherweise gibt es Probleme, denen ich gerade nicht begegnet bin.

0

Mit ocamlbuild, ein Standard-Weg, dies zu achievieng ist Ihre Module in eine mlpack verkapseln, wie beschrieben in: http://l-lang.blogspot.fr/2012/12/using-ocaml-packages-with-ocamlbuild.html

Datei: Repo-/A.ml

let a = 3;; 

Datei: repo/b. ml

let b = A.a;; 

Datei: repo.mlpack

repo/A 
repo/B 

Datei: main.ml

Repo.B.b 

Diese befasst sich mit dem Namen Kollision Problem aber zwingt Sie Ihr Modul zugreifen durch ein "Super-Modul"