我是Ocaml的新手,刚刚使用emacs、merlin和flycheck设置我的开发环境。除了一件事: merlin似乎不能识别同一项目中模块之间的依赖关系,一切都或多或少都在意料之中。
例如,我有一个包含两个模块的测试项目: main.ml和awesome.ml。
下面是引用第二个模块awesome.ml的main.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当我用utop-eval-buffer函数将main.ml缓冲区发送到utop中求值时,我得到了一个错误:“错误:未绑定的模块很棒”
我在项目的根目录下有.merlin,它有S指令。我知道它是被merlin发现的,因为它不会抱怨"open Core“
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模块不被识别,或者这是预期行为吗?
发布于 2015-07-19 22:23:47
一旦你编译了其他模块(实际上,一旦你编译了它的接口),Merlin就会看到它们。因此,如果您的.merlin是正确的,那么在您运行编译之后,它将看到所有内容。基于您的.merlin文件,您的文件确实应该位于src文件夹中,即您的项目布局,应该如下所示:
Makefile
.merlin
src/
awesome.ml
main.ml这不是必需的布局,但这就是您向Merlin描述的布局。我怀疑它不一样的原因是你的Makefile。
附注:作为附注,您的代码中有一个小问题:您应该打开Core.Std而不是Core。
发布于 2015-10-22 02:04:15
正如Ivan's answer所指出的,Merlin只有在编译项目中的模块之后才能识别它。如果Merlin给您一个unbound module Foo错误,一种解决方案是运行
ocamlbuild foo.cmi发布于 2016-08-19 20:50:38
我也有同样的问题。我尝试通过opam或sources安装merlin,但我无法解决这个问题,直到我将".merlin“文件放到\src目录中--而不是根目录--并在其中添加了"REC”标记。
https://stackoverflow.com/questions/31499687
复制相似问题