我可以使用 BuckleScript 中的 OCaml 正则表达式吗? (特别是 Str.search_forward)

Can I use OCaml regular expressions from BuckleScript? (Str.search_forward in particular)

我正在将一个 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 (节点)时我如何 link 它们?

我可以同时使用 Javascript 或本机目标,但我想从 OCaml 语法升级到 ReasonML。如果你需要我的 demo.ml,这里是:

let qq=Str.regexp "/q/" and
() = Js.log "Hello, STR! BuckleScript"

Str 模块公开的功能实际上是 implemented in C,因此不容易移植到 JavaScript。正则表达式的任何 JavaScript 实施也可能比 built-in JavaScript 实施慢得多。

此外,为多个实现提供通用接口并非易事,因为正则表达式实现或多或少存在细微差别,并且彼此之间不完全兼容。大多数甚至都不是常规的,尽管名称如此。

关于如何实现 JS 和本机正则表达式的通用接口已经有一些讨论,但没有明显的解决方案,我不知道任何事情已经结束。但我认为至少你必须实现一个只接受正则表达式语法的通用子集的解析器,然后再将其传递给底层正则表达式引擎进行再次解析,这显然会对性能产生显着影响non-trivial 实施。

目前,您应该能够使用 Js.Re for JavaScript regexes and conditional compilation 以便使用 Str 或其他一些本机实现。

另一种选择可能是编译 ocaml-re to JavaScript using ,然后使用 externals 与之交互。或者如果可能的话将项目移植到bsb,直接使用它。但是,这可能会显着增加代码包的大小,而且实现起来并不是特别简单。