我正在迁移到OCaml的最新版本(以及Jane Street的Core模块(,但希望我的代码继续使用旧版本编译。为此,我想创建一个具有可移植功能的模块,根据版本的不同,该模块可以映射到旧接口或新接口。查询OCaml的版本和Jane Street Core的版本都可以。
我们如何在运行时查找编译器或Jane Street Core的版本?我知道我可以通过我的构建系统传递ocamlopt --version
的输出,但理想情况下,我不应该以特殊的方式调用我的程序。
很抱歉回答一个略有不同的问题,但这可能是XY问题:如果你想构建一个兼容包,在运行时确定包的版本并没有真正的帮助,因为类似的东西
let f = if Sys.ocaml_version > ... then new_function else compat_function
要求CCD_ 2独立于CCD_ 3的运行时值而存在。
兼容性软件包的一个常见解决方案是在构建时更早地检测版本,例如使用cppo或使用一些代码生成,例如请参阅https://github.com/janestreet/result或https://github.com/ocaml/stdlib-shims.
您可以使用此处记录的Compiler_libs
中的Config.version
https://ocaml.org/api/compilerlibref/Config.html.
注意来自Compiler_libs:的此警告
此库是内部OCaml编译器API的一部分,不是语言标准库。没有兼容性保证在发布之间,因此针对这些模块编写的代码必须愿意依赖特定的OCaml编译器版本。
您可以使用Sys.ocaml_version
检索OCaml版本号。
utop # Sys.ocaml_version;;
- : string = "4.13.1"
恐怕在浏览了Jane Street Base和Core API文档后,我看不到在运行时查询版本号的方法。