Как вызвать функцию, сгенерированную 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)
Он скомпилировался, но не вернул правильный вывод:
Если я напишу в 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 ответ
Вот один из возможных способов сделать это.
В нашем коде 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>
И это должно работать.