Могу ли я использовать регулярные выражения OCaml из BuckleScript?(Str.search_forward в частности) - PullRequest
1 голос
/ 09 мая 2019

Я портирую проект 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 Ответ

2 голосов
/ 09 мая 2019

Функциональность, предоставляемая модулем Str, на самом деле реализована в C , и поэтому ее нелегко переносить на JavaScript. Любая реализация JavaScript регулярных выражений, вероятно, будет значительно медленнее, чем встроенная реализация JavaScript.

Кроме того, предоставление общего интерфейса для нескольких реализаций не является тривиальным, поскольку реализации Регулярного выражения отличаются более или менее тонкими способами и не полностью совместимы друг с другом. Большинство даже не регулярные, несмотря на название.

Были некоторые дискуссии о том, как можно создать общий интерфейс для JS и собственных регулярных выражений, но нет очевидного решения, и я не знаю, что что-то было сделано. Но я бы подумал, что, по крайней мере, вам придется реализовать синтаксический анализатор, который будет принимать только общее подмножество синтаксиса регулярных выражений, прежде чем передать его в базовый механизм регулярных выражений для повторного анализа, что, очевидно, окажет заметное влияние на производительность. и нетривиально реализовать.

На данный момент вы должны иметь возможность использовать Js.Re для регулярных выражений JavaScript и условную компиляцию , чтобы использовать Str или какую-либо другую реализацию нативно.

Другой альтернативой может быть компиляция ocaml-re в JavaScript с использованием и последующее взаимодействие с ним с использованием external s. Или перенесите проект на bsb, если это возможно, чтобы использовать его напрямую. Однако это, вероятно, значительно увеличит размер пакета кода, и это не так просто сделать.

...