什么是 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)
|}
];
在许多使用 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)
|}
];