我是 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 时,我收到一个错误:“错误:未绑定(bind)模块真棒”
我在具有 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 模块或者这是预期的行为?
最佳答案
一旦你编译它们,Merlin 就会看到其他模块(事实上,一旦你编译了它的接口(interface))。因此,鉴于您的 .merlin
是正确的,它会在您运行编译后看到所有内容。您的文件确实应该在 src
中文件夹,即您的项目布局,基于您的 .merlin
文件应如下所示:
Makefile
.merlin
src/
awesome.ml
main.ml
这不是必需的布局,但这是您向 Merlin 描述的布局。原因,我怀疑它不一样,是你的
Makefile
.附言顺便说一句,您的代码中有一个小问题:您应该打开
Core.Std
不是 Core
.
关于emacs - Merlin 提示同一个项目中缺少一个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499687/