如何调用js_of_ocaml生成的函数?

时间:2016-05-06 13:07:06

标签: javascript ocaml js-of-ocaml

我是JavaScript新手,我正在尝试使用js_of_ocaml

我首先写了一个非常简单的cubes.ml

let simple (a: int) =
  a + 1234

然后遵守它:

ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax \
          -syntax camlp4o -linkpkg -o cubes.byte cubes.ml

然后生成JavaScript文件:

js_of_ocaml cubes.byte

以下是生成的cubes.js。请注意,我们在该文件中找不到1234或函数名称simple

我有另一个JavaScript文件Home.js,我希望函数callSimple调用cubes.js中生成的内容。但我不知道如何写它。有人可以帮忙吗?

(function () {
    ...
    function callSimple(a) {
        return ???;
    };
    ...
})();

修改1:

我尝试了@EdgarAroutiounian提出的解决方案:

(* cubes.ml *)
let () =
  Js.Unsafe.global##.jscode := (object%js
    val simple = Js.wrap_meth_callback
        (fun a -> a + 1234)
    val speak = Js.wrap_meth_callback
        (fun () -> print_endline "hello")
  end)

它确实编译了,但它没有返回正确的输出: enter image description here

如果我写home.js

confirm(jscode.simple(10)); // 1244 is expected
confirm(jscode.speak()); // "hello" as string is expected

第一行返回function (a){return p(c,aM(b,a))},第二行返回0。它们不是我所期望的。

1 个答案:

答案 0 :(得分:4)

这是一种可能的方法。

我们的OCaml代码旨在向JavaScript公开:

let () =
  Js.Unsafe.global##.jscode := (object%js
    val simple = Js.wrap_meth_callback
        (fun a -> a + 1234)
    val speak = Js.wrap_meth_callback
        (fun () -> print_endline "hello")
  end)

请注意,我使用ppx扩展程序,我建议您也这样做:这意味着不再需要camlp4。 您可以使用以下代码编译该代码:

ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T
js_of_ocaml T -o cubes.js

然后在您的其他文件中home.js

console.log(jscode.simple(10));
console.log(jscode.speak());

index.html

<!DOCTYPE html>
<meta charset="utf-8">
<body>
  <script src="cubes.js"></script>
  <script src="home.js"></script>
</body>

这应该有用。