如何可选地提供 OCaml (let*) 运算符,以与新旧编译器一起使用?
How to provide an OCaml (let*) operator optionally, to work with old and new compilers?
我有一个模块 MyMonad
,它提供绑定函数作为 (let*)
运算符,但也作为旧式代码的 >>=
运算符。
想法是旧代码可以将其用作:
let foobar () =
let open MyMonad in
foo "test" >>= fun s ->
bar s 1 >>= fun (a, b) ->
return a + b
并且在 OCaml >= 4.08 上编译的新代码可以用作:
let foobar () =
let open MyMonad in
let* s = foo "test" in
let* a, b = bar s 1 in
return a + b
在模块 MyMonad.ml
中,这些运算符以直接的方式实现:
let (>>=) a f =
...
let (let*) = (>>=)
但是,在 OCaml <= 4.07 上,最后一行是语法错误。 MyMonad.mli
接口文件中的val (let*) : ...
行也是如此。
这个问题特别是当这个模块也打算用于 BuckleScript(现在的 ReScript)时,它基于 OCaml 4.06 并且不清楚他们何时升级到更高的 OCaml 版本。
如何将最后几行标记为仅在 OCaml >= 4.08 上编译?
注意: 我知道我可以创建两个模块,一个在另一个模块之上添加 (let*)
并在旧编译器中被排除。但是不知道有没有更优雅的解决方案
许多对语言或标准库的添加之后是向后移植的库,通常称为 *-shims
。
针对你的问题,有
为了自己回答这个问题,确实需要坚持使用 >>=
,新语法可以通过 shims 与旧的 OCaml 编译器甚至 BuckleScript 一起使用(现在是 ReScript)。
后者可以实现如下:
为 4.06 OCaml 编译器在当前目录中创建一个新的 OPAM 开关。这是当前 BuckleScript 版本所基于的版本,需要说服垫片实际做一些事情(对于更新的编译器版本,它们将编译为无操作):
opam switch create -wy --no-install . 4.06.0
安装 ocaml-syntax-shims
OPAM 包:
opam install -wy ocaml-syntax-shims
在你的bsconfig.json
配置文件中添加如下预处理行:
{
"pp-flags": "./_opam/bin/ocaml-syntax-shims -dump-ast",
...
}
我有一个模块 MyMonad
,它提供绑定函数作为 (let*)
运算符,但也作为旧式代码的 >>=
运算符。
想法是旧代码可以将其用作:
let foobar () =
let open MyMonad in
foo "test" >>= fun s ->
bar s 1 >>= fun (a, b) ->
return a + b
并且在 OCaml >= 4.08 上编译的新代码可以用作:
let foobar () =
let open MyMonad in
let* s = foo "test" in
let* a, b = bar s 1 in
return a + b
在模块 MyMonad.ml
中,这些运算符以直接的方式实现:
let (>>=) a f =
...
let (let*) = (>>=)
但是,在 OCaml <= 4.07 上,最后一行是语法错误。 MyMonad.mli
接口文件中的val (let*) : ...
行也是如此。
这个问题特别是当这个模块也打算用于 BuckleScript(现在的 ReScript)时,它基于 OCaml 4.06 并且不清楚他们何时升级到更高的 OCaml 版本。
如何将最后几行标记为仅在 OCaml >= 4.08 上编译?
注意: 我知道我可以创建两个模块,一个在另一个模块之上添加 (let*)
并在旧编译器中被排除。但是不知道有没有更优雅的解决方案
许多对语言或标准库的添加之后是向后移植的库,通常称为 *-shims
。
针对你的问题,有
为了自己回答这个问题,确实需要坚持使用 >>=
,新语法可以通过 shims 与旧的 OCaml 编译器甚至 BuckleScript 一起使用(现在是 ReScript)。
后者可以实现如下:
为 4.06 OCaml 编译器在当前目录中创建一个新的 OPAM 开关。这是当前 BuckleScript 版本所基于的版本,需要说服垫片实际做一些事情(对于更新的编译器版本,它们将编译为无操作):
opam switch create -wy --no-install . 4.06.0
安装
ocaml-syntax-shims
OPAM 包:opam install -wy ocaml-syntax-shims
在你的
bsconfig.json
配置文件中添加如下预处理行:{ "pp-flags": "./_opam/bin/ocaml-syntax-shims -dump-ast", ... }