Мерлин жалуется на отсутствующий модуль в том же проекте

Я новичок в Ocaml и просто настраиваю свою среду разработки с помощью emacs, merlin и flycheck. Все работает более или менее ожидаемо, за исключением одного: Мерлин, похоже, не способен распознать зависимости между модулями в одном проекте.

Например, у меня есть тестовый проект с двумя модулями: main.ml и awesome.ml.

вот мой main.ml, который ссылается на второй модуль 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));

вот awesome.ml:

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

Когда я отправляю буфер main.ml для оценки в utop с помощью функции utop-eval-buffer, я получаю сообщение об ошибке: "Ошибка: Unbound module Awesome"

У меня есть.merlin в корне проекта, в котором есть S-инструкция. Я знаю, что его нашел Мерлин, так как он не жалуется на "открытое ядро"

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

вот мои _tags:

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

обычная компиляция проекта с ocamlbuild работает нормально, без ошибок. вот Makefile

## Makefile
default: main
main: main.native

test: test.native

%.native:
   ocamlbuild -use-ocamlfind $@
   mv $@ $*

.PHONY: test default

какие-либо идеи, почему Awesome модуль не распознается в Utop или это ожидаемое поведение?

3 ответа

Merlin увидит другие модули после того, как вы скомпилируете их (фактически, после того, как вы скомпилировали их интерфейсы). Так учитывая ваш .merlin правильно, он увидит все после запуска компиляции. Ваши файлы действительно должны быть в src папка, т. е. макет вашего проекта, основанный на .merlin файл должен выглядеть так:

Makefile
.merlin
src/
   awesome.ml
   main.ml

Это не обязательный макет, но это тот, который вы описали Merlin. Причина, почему я подозреваю, что это не то же самое, это ваша Makefile,

PS Как примечание, в вашем коде есть небольшая проблема: вы должны открыть Core.Std не Core,

Как указывал ответ Ивана, Merlin может распознать модуль в вашем проекте только после того, как вы скомпилируете его. Если Мерлин дает тебе unbound module Foo ошибка, одно из решений заключается в запуске

ocamlbuild foo.cmi

У меня такая же проблема. Я попытался установить merlin через opam или исходники, но я не смог решить эту проблему, пока я не поместил файл.merlin в каталог \src, а не в корень, с тегом REC.

Другие вопросы по тегам