在许多使用 ReasonML 的项目中,经常使用首字母缩写词 PPX,但很少解释。
什么是 PPX?
为什么 ReasonML 需要它们?
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)
|}
];
PPX 来自 Ocaml 生态系统,ReasonML 是其中的一部分。基本上,PPX 为您提供了一个 API 来扩展语言语法。
查看http://ocamllabs.io/doc/ppx.html
谢谢你