ocaml - 使兼容的 ocaml、camlp4、ppx、node、js_of_ocaml、ocamlbuild

标签 ocaml opam camlp4 js-of-ocaml ppx

安装后npmnode , 用 js_of_ocaml 编译 OCaml 文件给出了错误,因此我做了 opam switch reinstall system :

:testweb $ opam switch reinstall system
Your system compiler has been changed. Do you want to upgrade your OPAM installation ? [Y/n] y

=-=- Upgrading system -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=  🐫 
[WARNING] base-ocamlbuild.base is not available because it requires OCaml >= 3.10 & < 4.03. Skipping.
[WARNING] camlp4.4.02+system is not available because your system doesn't comply with preinstalled &
      ocaml-version >= "4.02" & ocaml-version < "4.03". Skipping.
[WARNING] ppx_tools.4.02.3 is not available because your system doesn't comply with ocaml-version >=
      "4.02.0" & ocaml-version < "4.03.0". Skipping.
The following dependencies couldn't be met:
  - deriving -> camlp4
Your request can't be satisfied:
  - camlp4 is not available because your system doesn't comply with ocaml-version >= "4.04".

No solution found, exiting
The former package state can be restored with opam switch import "/Users/softtimur/.opam/backup/state-20160418124642.export" --switch system

然后,我意识到ocamlfind不再工作了:
:testweb $ ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T
-bash: /Users/softtimur/.opam/system/bin/ocamlfind: No such file or directory

PS:node --versionv6.1.0 ; npm --version3.8.6 ; ocaml -versionThe OCaml toplevel, version 4.03.0 .js_of_ocaml --version2.7 ,但在 opam swtich reinstall system 之后,它给出 -bash: /Users/softtimur/.opam/system/bin/js_of_ocaml: No such file or directory .

有谁知道如何使所有这些软件包兼容?

之前:这是安装后的编译错误npmnode ,并在做之前 opam switch reinstall system :
:testweb $ ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T
Failure("Ast_mapper: OCaml version mismatch or malformed input")
File "cubes.ml", line 1:
Error: Error while running external preprocessor
Command line: /Users/softtimur/.opam/system/lib/js_of_ocaml/./ppx_js '/var/folders/fn/0rmvqqbs4k76lg5g6b7kll100000gn/T/camlppxffe989' '/var/folders/fn/0rmvqqbs4k76lg5g6b7kll100000gn/T/camlppx02e06a'

另一种方式也报错:
:testweb $ ocamlfind ocamlc -package js_of_ocaml -syntax camlp4o -package js_of_ocaml.syntax -linkpkg -o cubes.byte cubes.ml
Fatal error: unknown C primitive `caml_is_printable'
File "cubes.ml", line 1:
Error: Error while running external preprocessor
Command line: camlp4 '-I' '/usr/local/lib/ocaml/camlp4' '-I' '/Users/softtimur/.opam/system/lib/js_of_ocaml' '-parser' 'o' '-parser' 'op' '-printer' 'p' 'pa_js.cmo'  'cubes.ml' > /var/folders/fn/0rmvqqbs4k76lg5g6b7kll100000gn/T/ocamlpp8b28e8

最初:
我最初的目标是编写和编译 cubes.ml这样 1) 它封装了一个 OCaml 函数来创建一个可以在 web 中调用的 JS 函数; 2)OCaml函数和字节码可以在Linux下命令行测试。
cubes.ml如下:
let () =
  let oneArgument (a: int) = a + 100 in
  Js.Unsafe.global##.jsOneArgument := Js.wrap_callback oneArgument;
  print_string "hello\n";
  exit 0

然后,ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T应该生成 T使得 ./T应该返回 hello .和 js_of_ocaml T -o cubes.js应该生成 cubes.js使得函数 jsOneArgumentcubes.js可以被其他 JS 或 HTML 文件调用。

在我弄乱包裹之前,./T返回 Unimplemented Javascript primitive caml_pure_js_expr! ,这就是为什么我安装了 npm , node , 等等...

最佳答案

我切换回 OCaml 4.02.3:

opam switch 4.02.3

然后,
eval `opam config env`

然后,
opam install ppx_tools js_of_ocaml

结果,ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T生成 T , 和 js_of_ocaml T -o cubes.js生成 cubes.js . node cubes.js确实返回 hello .

然而,./T仍然返回 Unimplemented Javascript primitive caml_pure_js_expr! ,我将为此打开另一个帖子......

关于ocaml - 使兼容的 ocaml、camlp4、ppx、node、js_of_ocaml、ocamlbuild,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37256100/

相关文章:

algorithm - 测试一个列表是否是另一个列表的子列表而不测试元素之间的相等性

types - OCaml 可变变体类型

ocaml - Opam 总是被锁文件锁住

安装tcoq时OCaml和预处理器有不兼容的版本错误

ocaml - 多参数构造函数比单个元组参数构造函数有用吗?

OCaml 用户定义类型模式匹配

ocaml - 在 OPAM 中切换环境

emacs - 快鸡 "Error: Could not compile mli file"

syntax - 带有语法扩展的 OCaml 顶层

ocaml - 是否有可能获得 OCaml 程序的 AST?