Sof*_*mur 5 javascript ocaml js-of-ocaml
我是JavaScript新手,正在尝试使用js_of_ocaml。
我首先写的很简单cubes.ml:
let simple (a: int) =
a + 1234
Run Code Online (Sandbox Code Playgroud)
然后编译它:
ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax \
-syntax camlp4o -linkpkg -o cubes.byte cubes.ml
Run Code Online (Sandbox Code Playgroud)
然后生成JavaScript文件:
js_of_ocaml cubes.byte
Run Code Online (Sandbox Code Playgroud)
这是生成的cubes.js。请注意,我们在该文件中找不到1234名称或功能名称simple。
我还有另一个JavaScript文件Home.js,我希望该函数callSimple调用在中生成的内容cubes.js。但是我不知道怎么写。有人可以帮忙吗?
(function () {
...
function callSimple(a) {
return ???;
};
...
})();
Run Code Online (Sandbox Code Playgroud)
编辑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)
Run Code Online (Sandbox Code Playgroud)
如果我写home.js:
confirm(jscode.simple(10)); // 1244 is expected
confirm(jscode.speak()); // "hello" as string is expected
Run Code Online (Sandbox Code Playgroud)
第一行返回function (a){return p(c,aM(b,a))},第二行返回0。他们不是我所期望的。
这是一种可能的方法。
在我们打算暴露给 JavaScript 的 OCaml 代码中:
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)
Run Code Online (Sandbox Code Playgroud)
请注意,我正在使用ppx扩展名,我建议您也这样做:这意味着不再使用camlp4. 您可以使用以下命令编译该代码:
ocamlfind ocamlc -package js_of_ocaml.ppx -linkpkg cubes.ml -o T
js_of_ocaml T -o cubes.js
Run Code Online (Sandbox Code Playgroud)
然后在你的另一个文件中, home.js
console.log(jscode.simple(10));
console.log(jscode.speak());
Run Code Online (Sandbox Code Playgroud)
和一个index.html:
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="cubes.js"></script>
<script src="home.js"></script>
</body>
Run Code Online (Sandbox Code Playgroud)
这应该有效。
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |