1

我有下面的 OCaml 文件,它可以在没有这个文件的情况下正确编译ppx并且失败dune

(library
 (name so_proj)
 (preprocess
  (pps
   ppx_inline_test
   ppx_deriving.show
   ppx_deriving.ord
   ppx_deriving.map
   ppx_deriving.eq
   ppx_deriving.fold
   ppx_deriving.iter)))

并与

(library
 (name so_proj))

错误是

File "SO_naming_existential.ml", line 23, characters 16-18:
23 |  fun (Mod (type xr) (m : xr)) ->
                     ^^
Error: migration error: existentials in pattern-matching is not supported before OCaml 4.13

这是有问题的 OCaml 文件,它使用了一种新语法(并提供了一个等效的 - 我相信 - 当它不可用时的版本)

type existentiel = Mod : 'x -> existentiel

module type existentiel_m = sig
  type x

  val value : x
end

let to_Module : existentiel -> (module existentiel_m) =
 fun (Mod m) ->
  let namedxr : type xr. xr -> (module existentiel_m) =
   fun v ->
    (module struct
      type x = xr

      let value = v
    end)
  in
  namedxr m

(* Since 4.13 https://github.com/ocaml/ocaml/pull/9584 *)
let to_Module2 : existentiel -> (module existentiel_m) =
 fun (Mod (type xr) (m : xr)) ->
  (module struct
    type x = xr

    let value = m
  end)

为了确认错误的来源(并首先运行以避免浪费时间..),该命令 dune build --verbose确实指向发生在ppx

Running[2]: (cd _build/default && .ppx/0789030747a4993265eb655c993f5cab/ppx.exe --cookie 'inline_tests="enabled"' --cookie 'library-name="so_proj"' -o SO_naming_existential.pp.ml --impl SO_naming_existential.ml -corrected-suffix .ppx-corrected -diff-cmd - -dump-ast)
Command [2] exited with code 1:
$ (cd _build/default && .ppx/0789030747a4993265eb655c993f5cab/ppx.exe --cookie 'inline_tests="enabled"' --cookie 'library-name="so_proj"' -o SO_naming_existential.pp.ml --impl SO_naming_existential.ml -corrected-suffix .ppx-corrected -diff-cmd - -dump-ast)
File "SO_naming_existential.ml", line 23, characters 16-18:
23 |  fun (Mod (type xr) (m : xr)) ->
                     ^^
Error: migration error: existentials in pattern-matching is not supported before OCaml 4.13

可以强制ppx使用 4.13,还是在 ppx 与给定版本不兼容时收到警告?(或者它是一个错误?)

4

1 回答 1

2

可执行文件或库只能由由同一编译器编译的编译单元组成。换句话说,您不能用一个编译器构建项目的某些部分,而用另一个编译器构建其他部分。

当您使用 dune 编译 OCaml 项目时,将在 PATH 变量(在 Linux 中)指定的目录中搜索编译器。您可以使用 shell 命令查看选择了哪个编译器which ocaml。并ocaml -version会告诉你它的版本。

如果您正在使用 opam(很可能是),那么您可以使用以下 shell 命令安装所需版本的编译器,

opam switch create 4.13.1

完成后,激活创建的开关

eval $(opam env)

这将确保新安装的 OCaml 版本在您的路径中可用。which ocaml使用和仔细检查ocaml -version

最后,安装项目所需的依赖项opam install并重建项目。

于 2022-02-01T00:39:25.203 回答