CamlP5 已复活,并已支持 ppx rewriter

CamlP5 是 OCaml 的一个 preprocessor,提供类似于 Lisp macro 的功能,既不 type safe 也不 hygienic。(如果你想要 hygienic 且 type safe 的,可以試下 BER MetaOCaml,但是以这 OCaml 每次重大更新就要重写一次的性质,不建議用在生命週期比较長的项目上)前身是 CamlP4,被整合进 OCaml 后原作者 Daniel de Rauglaudre fork 了项目并改名 CamlP5。知名項目 MetaOCaml, HOL-Light, Coq 都曾用过 CamlP4。后来 CamlP4 从 OCaml 中移除,原作者因为上了年纪不再有精力维护,CamlP5 开发中止了一段时间,没有跟进 OCaml 的一些新特性。

现在的维护者 chetmurthy 因为认为用 CamlP5 作为框架实现 ppx rewriter 相比用 OCaml 现在用的 ppxlib 有一定优越性,接手了 CamlP5 的开发,目前 alpha 版本已支持最新 OCaml

我自已有一些旧的代码用到 CamlP5 要移植,和 chetmurthy 有过一些交流。因为 CamlP5 的用户多了推动项目发展对我有好处,所以在这里 py 推广下。

一直没学会怎么写一个ppx rewiter = =

用 OCaml 提供的 ppxlib 界面有一个难点就是不同版本的 OCaml 內部 ast 都不一样,OCaml 在有 ppx 后共出过 11 种 ast,只能通过查文档来了解。而 CamlP5 用的 ast 是根據 OCaml 语法另外定义的,只要 OCaml 语法没有大改动就能保持兼容