12

我是 Ocaml 的新手,只是用 emacs、merlin 和 flycheck 设置我的开发环境。除了一件事之外,一切都或多或少可以预期:merlin 似乎无法识别同一项目中模块之间的依赖关系。

例如,我有一个包含两个模块的测试项目: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-eval-buffer 函数评估到 utop 时,我收到一个错误:“错误:未绑定模块真棒”

我在具有 S 指令的项目的根目录中有 .merlin。我知道它是 merlin 发现的,因为它不会抱怨“开放核心”

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

任何想法为什么在 utop 中无法识别 Awesome 模块或者这是预期的行为?

4

3 回答 3

13

一旦你编译它们,Merlin 就会看到其他模块(事实上,一旦你编译了它的接口)。所以如果你.merlin是正确的,它会在你运行编译后看到一切。您的文件确实应该在一个src文件夹中,即您的项目布局,基于您的.merlin文件应该如下所示:

Makefile
.merlin
src/
   awesome.ml
   main.ml

这不是必需的布局,但这是您向 Merlin 描述的布局。我怀疑它不一样的原因是你的Makefile.

PS 顺便说一句,您的代码中有一个小问题:您不应该Core.Std打开Core.

于 2015-07-19T14:23:46.757 回答
2

正如Ivan 的回答所指出的,Merlin 只能在编译后识别项目中的模块。如果 Merlin 给您一个unbound module Foo错误,一种解决方案是运行

ocamlbuild foo.cmi
于 2015-10-21T18:04:15.313 回答
1

我有同样的问题。我尝试通过 opam 或源安装 merlin,但我无法解决这个问题,直到我将“.merlin”文件放入 \src 目录——而不是根目录——并在其中带有“REC”标签。

于 2016-08-19T12:50:37.933 回答