2

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

什么是 PPX?

为什么 ReasonML 需要它们?

4

2 回答 2

4

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

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

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

例子

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

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

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

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

  [%style
    {|
      color: red;
      margin: auto 0 10px 1em;
      width: 70%;
      background: url(http://example.com/test.jpg)
    |}
  ];
于 2020-06-23T20:56:47.903 回答
2

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

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

谢谢

于 2020-06-23T14:51:29.680 回答