繁体   English   中英

如何使用js_of_ocaml模块?

[英]How to use modules with js_of_ocaml?

我目前正在开发一个用OCaml编写的网站项目,并使用js_of_ocaml编译为javascript。 只要我使用命令ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o -linkpkg -o file.byte file.ml只有一个源文件, ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o -linkpkg -o file.byte file.ml但是我想在我的项目中包含几个模块。 我怎样才能做到这一点 ?

其他模块实际上是由ocamllex和menhir制作的词法分析器和解析器。 我已经阅读了关于如何使用ocamllex和menhir与js_of_ocaml的教程 ,但它对安装js_of_ocaml的地方做了错误的假设(我用opam安装它)并且它使用ocamlbuild我想知道如何在不使用自动化的情况下手动完成像ocamlbuild这样的工具。

我通过尝试理解官方示例的makefile找到了解决方案。

这是我的Makefile:

OBJS=file1.cmo file2.cmo file3.cmo
NAME=projectname
OCAMLC=ocamlfind ocamlc -package js_of_ocaml -package js_of_ocaml.syntax -syntax camlp4o

$(NAME).byte: $(OBJS)
        $(OCAMLC) -linkpkg -o $@ $(OBJS)

$(NAME).js: $(NAME).byte
        js_of_ocaml $<

%.cmo: %.ml
        $(OCAMLC) -c $<
...

ocamlbuild会记录它执行的操作。 在ocamlbuild调用之后,查看_build/_log ,您将看到它调用的所有命令,带有完整的参数等。这可能是您最简单的方法来计算如何手动完成。

(关于+site-lib假设和OPAM,您应该向本教程的作者报告,他们希望确保它也适用于OPAM用户。)

这需要大量的实验,但我终于想出了如何让ocamlbuild将相同的标志传递给ocamlfind,就像那些makefile中的ocsigen一样。 我也在使用与OPAM一起安装的js_of_ocaml。

对于我的测试用例,我创建了一个包含两个文件的小例子 - main.ml和square.ml。

square.ml:

let square x = x * x

main.ml:

let () = (Js.Unsafe.coerce Dom_html.window)##square <- Js.wrap_callback Square.square

成功构建此命令的命令:

ocamlbuild -use-ocamlfind -pkgs js_of_ocaml,js_of_ocaml.syntax -syntax camlp4o main.byte

这会产生与我的初始测试用例相同的JS输出,其中square函数在main.ml中。 ocamlbuild日志显示了我的期望(两次调用ocamldep,两次调用ocamlc -c,一次调用ocamlc -linkpkg)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM