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

时间:2019-05-09 12:04:36

标签: regex ocaml bucklescript bsb

我将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"

1 个答案:

答案 0 :(得分:2)

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

此外,为正则表达式实现或多或少地以细微的方式存在差异,并且彼此之间并不完全兼容,因此为多个实现提供通用接口并不是一件容易的事。尽管有名字,但大多数人甚至都不规则。

已经围绕如何实现JS和本机正则表达式的通用接口进行了一些讨论,但是没有明显的解决方案,我不知道有什么结论。但是我认为至少必须实现一个解析器,该解析器只接受正则表达式语法的公共子集,然后再将其传递给基础正则表达式引擎进行再次解析,这显然会对性能产生显着影响并且实施起来并不容易。

就目前而言,您应该能够将Js.Re用于JavaScript正则表达式和conditional compilation,以便本地使用Str或其他实现方式。

另一种替代方法可能是使用ocaml-re编译为JavaScript,然后使用external与之交互。或尽可能将项目移植到bsb,以直接使用它。但是,这可能会大大增加代码束的大小,而且并不是特别容易实现。