2015-07-19 7 views
6

Ich bin neu bei Ocaml und habe gerade meine Entwicklungsumgebung mit Emacs, Merlin und Flycheck eingerichtet. Alles funktioniert mehr oder weniger, bis auf eine Sache: Merlin scheint die Abhängigkeiten zwischen den Modulen im selben Projekt nicht zu erkennen.Merlin beschwert sich über ein fehlendes Modul im selben Projekt

z.B. Ich habe ein Testprojekt mit zwei Modulen: main.ml und awesome.ml.

hier ist mein main.ml die awesome.ml

(* main.ml *) 
open Core 
module A = Awesome 
let _ = 
    Printf.printf "hello \n Converted to string we get: %s\n" 
    (A.str_of_t (A.succ A.one_t)); 

hier ist awesome.ml das zweite Modul verweist:

(* awesome.ml *) 
type t = int 
let one_t = 1 
let succ i = i + 1 
let str_of_t = string_of_int 

wenn ich main.ml Puffer bewerten in utop senden mit utop-eval-buffer-Funktion, bekomme ich einen Fehler: "Fehler: Unbound Modul Awesome"

Ich habe .merlin in der Wurzel des Projekts, das S-Anweisung hat. Ich weiß es von merlin gefunden wird, da es nicht über „Open Core“

S src 
PKG core lwt ounit 
B _build/src 
B +threads 

hier ist mein _tags beschwert:

<src/**>: include 
<src/**>: package(oUnit), package(core) 
true:thread 

die regelmäßige Projektzusammenstellung mit ocamlbuild funktioniert gut, keine Fehler. hier ist Makefile

## Makefile 
default: main 
main: main.native 

test: test.native 

%.native: 
    ocamlbuild -use-ocamlfind [email protected] 
    mv [email protected] $* 

.PHONY: test default 

irgendwelche Ideen, warum Super-Modul nicht in utop erkannt wird oder dieses Verhalten erwartet wird?

+4

Nein, tue ich nicht; Ich beschwere mich nicht – Merlin

Antwort

10

Merlin wird andere Module sehen, sobald Sie sie kompiliert haben (in der Tat, sobald Sie ihre Schnittstellen kompiliert haben). Wenn Ihre .merlin korrekt ist, wird alles nach der Kompilierung angezeigt. Ihre Dateien in der Tat in einem src Ordner sein sollten, das heißt, Ihr Projekt-Layout, auf der Grundlage Ihrer .merlin Datei soll wie folgt aussehen:

Makefile 
.merlin 
src/ 
    awesome.ml 
    main.ml 

Dies ist kein erforderliches Layout, aber das ist die eine, die Sie beschrieben Merlin. Der Grund, warum ich vermute, dass es nicht dasselbe ist, ist Ihr Makefile.

P.S. Nur als Randnotiz gibt es ein kleines Problem in Ihrem Code: Sie sollten Core.Std nicht Core öffnen.

+0

danke Ivan. Es funktioniert immer noch nicht. Ich habe ein korrektes Projekt-Layout - die Quellen sind in src dir, .merlin ist in der Wurzel des Projekts. Der Grund für die B + Thread-Richtlinie ist hier: https://github.com/the-lambda-church/merlin, ich habe hinzugefügt, wie es in merlin docs vorgeschlagen wird. Sie haben recht mit open Core.Std. Ich habe die Compilation ausgeführt - die Sourcen kompilieren korrekt, ich sehe O Dateien in _build/src, merlin erkennt das awesome.ml Modul aber immer noch nicht.Sieht so aus, als ob etwas mit meinem Setup nicht stimmt - ich werde weiter graben. Vielen Dank! –

+0

Ich vermute, dass Sie Probleme mit Ihrem Makefile haben, und es kompiliert nichts. Also, ohne eine 'Makefile'-Datei, wenn ich einfach in das oberste Verzeichnis Ihres Projekts gehe und 'ocamlbuild src/main.native' ausstelle, dann erkennt Merlin' Awesome'-Modul. Im Grunde sehen Sie "Makefile" für mich falsch. Und es kompiliert nichts. Ein guter Check: Es sollte '_build/src/awesome.cmi'-Datei nach dem Ausführen von Build sein. – ivg

+0

Nein, Makefile ist gut - es kompiliert, erzeugt eine binäre Hauptdatei, die ich ausführen kann. awesome.cmi/awesome.cmo/awesome.cmt/awesome.cmti/awesome.cmxare erzeugt in _build/src –

1

Als Ivan's answer wies darauf hin, Merlin kann nur ein Modul in Ihrem Projekt erkennen, nachdem Sie es kompilieren. Wenn Merlin wird Ihnen einen unbound module Foo Fehler geben, eine Lösung zu laufen

ocamlbuild foo.cmi 
+0

Das hat es eigentlich komplett für mich behoben und ich habe keine Ahnung warum. Hat ocamlbuild irgendwie einen Zustand gespeichert? Ich bin ziemlich neu, es ist so gut möglich, dass ich bin nur sehr unwissend, wie die ganze Entwicklungsumgebung arbeitet hah – Jay

+0

Ocamlbuild die „foo.cmi“ Interface-Datei im „_build“ Verzeichnis speichern. Was ich als "Sparstaat" betrachte. – hugomg

+0

Ohhh macht Sinn. Ich nahm an, Merlin betrachtete die zweiten und nicht gebauten Dateien, die ich vermute. Ich vermute, ich lag falsch! – Jay

0

ich hatte das gleiche Problem. Ich habe versucht, merlin über opam oder Quellen zu installieren, aber ich konnte dieses Problem nicht lösen, bis ich die ".merlin" -Datei in das \ src-Verzeichnis - nicht an der Wurzel - mit einem "REC" -Tag hineinlegte.