我是Ocaml的新手,只是使用emacs,merlin和flycheck设置我的开发环境。除了一件事之外,一切都或多或少地起作用:merlin似乎无法识别同一项目中模块之间的依赖关系。
e.g。我有一个带有两个模块的测试项目: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时,我收到一个错误:“错误:未绑定的模块很棒”
我在项目的根目录中有.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
为什么在utop中无法识别Awesome模块或者这是预期的行为?
答案 0 :(得分:10)
.merlin
是正确的,它将在您运行编译后看到所有内容。您的文件确实应位于src
文件夹中,即基于.merlin
文件的项目布局应如下所示:
Makefile
.merlin
src/
awesome.ml
main.ml
这不是必需的布局,但这是您向Merlin描述的布局。我怀疑它不一样的原因是你的Makefile
。
P.S。作为附注,您的代码中存在一个小问题:您应该打开Core.Std
而不是Core
。
答案 1 :(得分:1)
正如Ivan's answer所指出的,Merlin只能在编译后识别项目中的模块。如果Merlin给你一个unbound module Foo
错误,一个解决方案是运行
ocamlbuild foo.cmi
答案 2 :(得分:1)
我遇到了同样的问题。我尝试通过opam或源代码安装merlin,但是直到我将“.merlin”文件放入\ src目录 - 而不是根目录 - 并且其中带有“REC”标记,我才能解决这个问题。