什么是 PPX?

What are PPXes?

在许多使用 ReasonML 的项目中,缩写词 PPX 经常被使用,但很少解释。

什么是 PPX?

为什么 ReasonML 需要它们?

PPX 来自 Ocaml 生态系统,ReasonML 是其中的一部分。基本上,PPX 给你一个 API 来扩展语言语法。

查看 http://ocamllabs.io/doc/ppx.html

感谢ephoz

PPX(预处理器扩展)是抽象语法树 (AST) 重写器。本质上只是一个函数 ast => ast.

AST 是语法的表示,是解析源代码的结果树数据结构。由于 PPX 只能接受和 return 这个 AST,它被限制在现有的 OCaml/ReasonML 语法中。但是,它可以重新解释语法,并且可以在字符串中嵌入完全不同的语法,从而实现语法扩展的有限和封装形式。

PPX 也不允许重写整个 AST。它们仅限于用户使用与现有节点关联的属性 ([@...)) 或作为独立 AST 节点的扩展节点 ([%...]) 标记的节点。 PPX 将注册一个或多个挂钩,这些挂钩将在编译器遇到它们时接收与其关联的 AST,并且可以在编译器继续进入其阶段之前转换这些 AST 片段。

例子

ppx_deriving 可能是使用最广泛的 PPX。它允许从类型签名“派生”某些功能。例如:

[@deriving show]
type t = {
  foo: int,
  bar: string,
};

将生成一个 show 函数(以及其他一些函数),当给定一个 t 类型的值时,它将 return 一个漂亮的字符串表示形式。

ppx_bx_css and styled-ppx 都是将 CSS 解析为一些 OCaml/ReasonML 数据结构的 PPX,以便与各种 CSS-in-JS 库一起使用。这些将 CSS 语法嵌入带引号的字符串中,至少出于此目的,它只是一个普通字符串,允许换行并且不需要转义 "\.

  [%style
    {|
      color: red;
      margin: auto 0 10px 1em;
      width: 70%;
      background: url(http://example.com/test.jpg)
    |}
  ];