奥卡姆尔语的整个'ppx'机制有多官方/稳定?



对于上下文(如果您喜欢,可以跳过问题):我正在学习ocaml,并开始阅读真实世界ocaml。

到目前为止,我真的(真的!)喜欢这门语言和这本书。

有一件事我开始不太喜欢了,那就是当我试图"深入挖掘"时,这个神秘的"ppx"东西开始随处可见(通常这种挖掘涉及打开依赖的一些源代码,然后偶然发现一些"神奇"的东西,比如[@@deriving sexp])。

从大量的谷歌搜索/各种分散的来源…这似乎是某种基于AST转换的语法扩展机制。它似乎被大量使用(至少在简街图书馆是这样)。我几乎可以断定这是Ocaml的一个"非官方"或未记录的特性。例如,查看Ocaml手册,我找不到它的任何踪迹。

现在,问题。通过AST转换用新语法扩展ocaml的ppx机制有多官方/受支持?

编辑/注:@octachron在回答中指出,实际上是手册中我遗漏的功能的"痕迹"。这些[@@..]位的语法至少在manual/ocaml语法中有文档。

但是答案应该解决两件事:语法和语义。

  • 语法是关于"我们如何写出这些神奇的新东西"。
  • 语义是关于我们如何给它们附加意义。

@octachron已经给出了部分答案。现在很明显,这个"语法"是官方的。但是对我来说,将语义附加到这些语法扩展上的支持有多"正式"还是有点不清楚。所以我坚持接受一个关于语义更完整/更明确的答案)。

PS:据我所知,手册中没有关于这一点的任何内容,Ocaml编译器表面上对注释根本没有做任何事情(我想除了解析它们)。因此,除非我在手册中遗漏了其他内容,否则语言中没有"官方"机制允许您访问这些注释中的数据并对它们做任何有意义的事情。对吗?

要回答关于ppxs的官方状态的问题,它们是官方支持的语法扩展。属性和扩展节点的语法在https://ocaml.org/manual/attributes.html和https://ocaml.org/manual/extensionnodes.html的手册中有描述。还有一个基本框架可用于编写在编译器库(https://ocaml.org/api/compilerlibref/Ast_mapper.html)中导出的ppx,即使ppxlib是当前建议的选项。

这个问题有两个部分:

第一个是语法. @octachron已经很好地回答了这个问题。这些[@@..]位的语法是Ocaml语法的官方部分。它们在https://ocaml.org/manual/attributes.html和https://ocaml.org/manual/extensionnodes.html的手册中有描述。 第二部分是语义. 这里的答案要复杂得多。

注:八爪龙已经给出了一些答案。然而,对我来说,答案有点令人困惑。因此,我将尝试在这里自己写一个更详细的答案,试图直接解决这个困惑。

这里要理解的棘手部分(至少对我来说)是,你所谓的"官方支持",有点取决于你的期望或观点。

从编译器和Ocaml作为编程语言的角度来看……属性和注释没有任何意义。对于Ocaml编译器来说,它们基本上被视为注释。它们被解析器简单地识别并完全忽略。

如果问题是…Ocaml语言/编译器是否定义了一种将语义附加到扩展节点和注释的正式方式?那么答案是"不"。给编译器…它们根本没有语义。

任何意义都来自'ppx'预处理器。ppx预处理器是一个独立的Ocaml程序,它读取Ocaml源代码并将其解析为AST,然后转换AST。这个过程完全独立于Ocaml编译器,是一个真正的预处理器。

然而,有一种官方/标准/推荐的方式来创建和使用这种预处理器。

简而言之:

  • 对于创建ppx,您可以使用官方的ppxlib,这是一个Ocaml库。要在代码中使用一个ppx扩展名,你需要配置一个像dune这样的构建系统,在ocaml编译器之前执行它。

这些东西在"官方"ppxlib用户手册中有详细的解释。

最新更新