我正在将OCAML项目移植到推理中,但首先要扣除扣。我用
向项目目录播种bsb init .
并通过 *.ml文件复制。用
编译npm run build
给我错误:
[1/6]构建src/demo.cmj文件"/D/proglang/reason/SRC/DEMO.ML",第2行,字符7-17:错误:Unbound value str.regexp[2/6]构建src/lex.cmj文件"/d/proglang/reason/Src/lex.ml",第13行,字符26-44:错误:Unbound value str.search_forward
我的软件包。
"devDependencies": {
"bsb-native": "^4.0.7000"
}
和 ./node_modules/bsb-native/vendor/ocaml/lib/ocaml 包含文件 str.a str.cma str.cma str.cmi str.cmx str.cmx str.cmxs str.cmxs str.mli但是没有像str.ml这样的来源。另外,https://reasonml.github.io/api/str.html记录了我需要的功能,但是在定位JavaScript(node(时如何将它们链接到其中?
?我可以同时使用JavaScript或本机目标,但是我想从OCAML语法升级到ReasonMl。如果您需要我的demo.ml,则是:
let qq=Str.regexp "/q/" and
() = Js.log "Hello, STR! BuckleScript"
Str
模块所暴露的功能实际上是在C中实现的,因此不容易移植到JavaScript。任何JavaScript实现正则表达式的实现也可能比内置的JavaScript实现慢得多。
此外,为多个实现提供了一个共同的接口并不是微不足道的,因为正则表达实现在或多或少微妙的方式不同,并且彼此之间不完全兼容。尽管有名字,大多数人甚至都不是常规的。
关于如何完成JS和本机回调的常见界面进行了一些讨论,但是没有明显的解决方案,我不知道有任何结论。但是我认为,至少您必须实施一个只能接受正则语法的普通子集的解析器,然后再将其传递给基础的正则发动机才能再次解析,这显然会产生显着的性能影响实施并非谋生。
目前,您应该能够将Js.Re
用于JavaScript Regexes和有条件的编译,以便使用Str
或其他其他实现。
另一种替代方法可能是使用js of-ocaml将ocaml-re
编译为JavaScript,然后使用external
s与该编译。或在可能的情况下将项目移植到bsb
,直接使用它。但是,这可能会大大增加代码捆绑包的大小,而且完成并不是特别简单。