Могу ли я использовать регулярные выражения OCaml из BuckleScript? (Str.search_forward в частности)
Я портирую проект OCaml на ReasonML, но сначала на BuckleScript. Я посеял каталог проекта с
bsb init .
и скопировал файлы *.ml. Компилирование с
npm run build
дает мне ошибку:
[1/6] Building src / demo.cmj Файл "/d/ProgLang/reason/src/demo.ml", строка 2, символы 7-17: Ошибка: несвязанное значение Str.regexp [2/6] Здание src/lex.cmj Файл "/d/ProgLang/reason/src/lex.ml", строка 13, символы 26-44: Ошибка: несвязанное значение 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 ответ
Функциональность, предоставляемая Str
Модуль фактически реализован на C, и поэтому его нелегко переносить на JavaScript. Любая реализация JavaScript регулярных выражений, вероятно, будет значительно медленнее, чем встроенная реализация JavaScript.
Кроме того, предоставление общего интерфейса для нескольких реализаций не является тривиальным, поскольку реализации Регулярных выражений отличаются более или менее тонкими способами и не полностью совместимы друг с другом. Большинство даже не регулярные, несмотря на название.
Были некоторые дискуссии о том, как можно реализовать общий интерфейс для JS и собственных регулярных выражений, но нет очевидного решения, и я не знаю, что что-то было сделано. Но я бы подумал, что, по крайней мере, вам придется реализовать синтаксический анализатор, который будет принимать только общее подмножество синтаксиса регулярных выражений, прежде чем передать его в базовый механизм регулярных выражений для повторного анализа, что, очевидно, окажет заметное влияние на производительность. и нетривиально для реализации.
На данный момент вы должны быть в состоянии использовать Js.Re
для регулярных выражений JavaScript и условной компиляции для использования Str
или какая-то другая реализация изначально.
Другой альтернативой может быть компиляция ocaml-re
в JavaScript с помощью js-of-ocaml, а затем взаимодействовать с этим с помощью external
s. Или перенести проект в bsb
если возможно, использовать его напрямую. Это, вероятно, значительно увеличит размер вашего пакета кода, и это не так просто сделать.