Как вызвать функцию, сгенерированную 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>

И это должно работать.

Другие вопросы по тегам