我将OCaml项目移植到ReasonML,但首先移植到BuckleScript。我将项目目录植入了
bsb init .
并复制到* .ml文件。编译
npm run build
给我错误:
[1/6] Building src/demo.cmj File "/d/ProgLang/reason/src/demo.ml", line 2, characters 7-17: Error: Unbound value Str.regexp [2/6] Building src/lex.cmj File "/d/ProgLang/reason/src/lex.ml", line 13, characters 26-44: Error: Unbound value Str.search_forward
我的package.json有
"devDependencies": {
"bsb-native": "^4.0.7000"
}
和 ./ node_modules / bsb-native / vendor / ocaml / lib / ocaml 包含文件 str.a str.cma str.cmi str.cmx str.cmxs str.mli ,但是没有像str.ml这样的资源。另外,https://reasonml.github.io/api/Str.html记录了我需要的功能,但是在定位Javascript(节点)时如何链接它们?
我可以同时使用Javascript或本机目标,但是我想从OCaml语法升级到ReasonML。如果您需要我的demo.ml,则为:
let qq=Str.regexp "/q/" and
() = Js.log "Hello, STR! BuckleScript"
答案 0 :(得分:2)
Str
模块公开的功能实际上是implemented in C,因此不容易移植到JavaScript。任何正则表达式的JavaScript实现都可能比内置JavaScript实现慢得多。
此外,为正则表达式实现或多或少地以细微的方式存在差异,并且彼此之间并不完全兼容,因此为多个实现提供通用接口并不是一件容易的事。尽管有名字,但大多数人甚至都不规则。
已经围绕如何实现JS和本机正则表达式的通用接口进行了一些讨论,但是没有明显的解决方案,我不知道有什么结论。但是我认为至少必须实现一个解析器,该解析器只接受正则表达式语法的公共子集,然后再将其传递给基础正则表达式引擎进行再次解析,这显然会对性能产生显着影响并且实施起来并不容易。
就目前而言,您应该能够将Js.Re
用于JavaScript正则表达式和conditional compilation,以便本地使用Str
或其他实现方式。
另一种替代方法可能是使用ocaml-re
将js-of-ocaml编译为JavaScript,然后使用external
与之交互。或尽可能将项目移植到bsb
,以直接使用它。但是,这可能会大大增加代码束的大小,而且并不是特别容易实现。