【问题标题】:Ocaml: unknown directive `require'Ocaml:未知指令“要求”
【发布时间】:2019-02-13 20:58:39
【问题描述】:

在加载 OCaml 时,我在终端加载 ocaml 时收到此消息:

   ocaml
    OCaml version 4.07.1

   Unknown directive `require'.

到底是什么问题?


我之前修改了我的 ocamlinit 文件,因为我遇到了一些问题。它现在包含:

(* ## added by OPAM user-setup for ocamltop / base ## 3ec62baf6f9c219ae06d9814069da862 ## you can edit, but keep this line *)


(* Added by OPAM. *)                                                            

let () = try Topdirs.dir_directory (Sys.getenv "OCAML_TOPLEVEL_PATH")
 with Not_found -> ()
;;

#require "yojson";;
#use "topfind";;
#camlp4o
#thread;;
Topfind.don't_load ["compiler-libs.toplevel"];;
#require "core.top";;
#require "core.syntax";;
(* ## end of OPAM user-setup addition for ocamltop / base ## keep this line *)

编辑:

我在ocaml command line cannot find “topfind” 之前看过这个问题,但是我没有发现它有帮助,因为答案中没有指定每次打开 ocaml 之前都需要运行eval $(opam config env),因为下面有人告诉我。因此,我认为此人的说明对其他人有用。

【问题讨论】:

  • 它是如何安装的?你最近有修改什么吗?配置有变化吗?
  • @ShadowMitia 我修改了文件~/.ocamlinit,现在我将其内容包含在我的问题下方。我不记得我是如何安装 Ocaml 的。
  • #requiretopfind 提供。发生错误是因为您尝试在#use "topfind" 之前尝试#require
  • @glennsi 我把#use "topfind" 放在#require 上面,这让问题变得更糟。我现在得到:OCaml version 4.07.1Cannot find file topfind.Unknown directive'require'.
  • 情况更糟?更少的东西有用吗?我所看到的只是您有更多信息可以帮助您进行故障排除,这似乎是一种改进。也许你需要安装ocamlfind,或者如果你还没有安装eval $(opam config env)

标签: ocaml toplevel ocaml-toplevel


【解决方案1】:

您应将#use "topfind" 放在任何#require 指令之前。所以将#require "yojson";; 放在.ocamlinit 文件的末尾(在注释之后添加它也是一个好主意)。

#require 指令由ocamlfind 工具通过topfind 脚​​本提供,该脚本通过#use 指令加载到顶层,这是用于加载文件的标准内置指令。 topfind 文件在顶层初始化ocamlfind 系统,以便顶层现在可以访问ocamlfind 基础设施并加载系统中安装的库。如果您使用 opam 安装软件包,那么在启动顶层之前不要忘记在终端中执行 eval $(opam config env)(或更短的版本,在 opam 2.x eval $(opam env) 中可用)。例如,

eval $(opam config env)
ocaml

这是.ocamlinit文件的正确内容:

(* ## added by OPAM user-setup for ocamltop / base ## 3ec62baf6f9c219ae06d9814069da862 ## you can edit, but keep this line *)


(* Added by OPAM. *)                                                            

let () = try Topdirs.dir_directory (Sys.getenv "OCAML_TOPLEVEL_PATH")
 with Not_found -> ()
;;


#use "topfind";;
#camlp4o
#thread;;
Topfind.don't_load ["compiler-libs.toplevel"];;
#require "core.top";;
#require "core.syntax";;
(* ## end of OPAM user-setup addition for ocamltop / base ## keep this line *)

#require "yojson";;

【讨论】:

  • utop 是否自动添加了topfind?我只是使用了require,没有添加topfind。
  • 是的,它确实添加了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2011-12-12
相关资源
最近更新 更多