查看源代码 erl_pp (stdlib v6.2)

Erlang 美化打印器。

此模块中的函数用于生成抽象形式的美观表示,适合打印。所有函数都返回(可能是深层的)字符列表,如果形式错误,则会生成错误。

所有函数都可以有一个可选参数,用于指定一个钩子,如果在尝试打印未知形式时调用该钩子。

请注意,如果此模块中的函数用于将抽象代码转换回 Erlang 源代码,则封闭函数应首先由 legalize_vars/1 处理,以确保输出在语义上等同于抽象代码。

已知限制

在表达式以外的其他地方,无法为未知形式设置钩子函数。

另请参阅

erl_eval, erl_parse, io

摘要

类型

此模块中描述的函数中显示的可选参数 HookFunction 定义了一个函数,当在需要有效表达式的地方出现未知形式时,将调用该函数。如果 HookFunction 等于 none,则没有钩子函数。

选项 quote_singleton_atom_types 用于向所有单例原子类型添加引号。

函数

form/1,2 相同,但仅适用于属性 Attribute

form/1,2 相同,但仅适用于 Expressions 中的表达式序列。

美化打印一个 Form,它是 erl_parse:parse_form/1 返回的抽象形式类型。

form/1,2 相同,但仅适用于函数 Function

form/1,2 相同,但仅适用于 guard 测试 Guard

当 Erlang 编译器将记录展开为元组时,会在抽象表示中引入新的变量。由于展开是在抽象表示上完成的,因此编译器可以安全地使用在 Erlang 源代码中语法上无效的名称(名称以小写字母开头)来命名新变量,从而确保新名称的唯一性。

类型

链接到此类型

hook_function()

查看源代码 (未导出)
-type hook_function() ::
          none |
          fun((Expr :: erl_parse:abstract_expr(),
               CurrentIndentation :: integer(),
               CurrentPrecedence :: non_neg_integer(),
               Options :: options()) ->
                  io_lib:chars()).

此模块中描述的函数中显示的可选参数 HookFunction 定义了一个函数,当在需要有效表达式的地方出现未知形式时,将调用该函数。如果 HookFunction 等于 none,则没有钩子函数。

调用的钩子函数应返回(可能是深层的)字符列表。函数 expr/4 在钩子中很有用。

如果 CurrentIndentation 为负数,则没有换行符,仅使用空格作为分隔符。

链接到此类型

option()

查看源代码 (未导出)
-type option() ::
          {hook, hook_function()} |
          {encoding, latin1 | unicode | utf8} |
          {quote_singleton_atom_types, boolean()} |
          {linewidth, pos_integer()} |
          {indent, pos_integer()}.

选项 quote_singleton_atom_types 用于向所有单例原子类型添加引号。

选项 linewidth 控制格式化行的最大行宽(默认为 72 个字符)。

选项 indent 控制格式化行的缩进(默认为 4 个空格)。

链接到此类型

options()

查看源代码 (未导出)
-type options() :: hook_function() | [option()].

函数

-spec attribute(Attribute) -> io_lib:chars() when Attribute :: erl_parse:abstract_form().

等效于 attribute(Attribute, none)

链接到此函数

attribute(Attribute, Options)

查看源代码
-spec attribute(Attribute, Options) -> io_lib:chars()
                   when Attribute :: erl_parse:abstract_form(), Options :: options().

form/1,2 相同,但仅适用于属性 Attribute

-spec expr(Expression) -> io_lib:chars() when Expression :: erl_parse:abstract_expr().

等效于 expr(Expression, none)

链接到此函数

expr(Expression, Options)

查看源代码
-spec expr(Expression, Options) -> io_lib:chars()
              when Expression :: erl_parse:abstract_expr(), Options :: options().

等效于 expr(Expression, 0, Options)

链接到此函数

expr(Expression, Indent, Options)

查看源代码
-spec expr(Expression, Indent, Options) -> io_lib:chars()
              when Expression :: erl_parse:abstract_expr(), Indent :: integer(), Options :: options().

等效于 expr(Expression, Indent, 0, Options)

链接到此函数

expr(Expression, Indent, Precedence, Options)

查看源代码
-spec expr(Expression, Indent, Precedence, Options) -> io_lib:chars()
              when
                  Expression :: erl_parse:abstract_expr(),
                  Indent :: integer(),
                  Precedence :: non_neg_integer(),
                  Options :: options().

打印一个表达式。

它对于实现钩子很有用(请参阅已知限制部分)。

-spec exprs(Expressions) -> io_lib:chars() when Expressions :: [erl_parse:abstract_expr()].

等效于 exprs(Expressions, none)

链接到此函数

exprs(Expressions, Options)

查看源代码
-spec exprs(Expressions, Options) -> io_lib:chars()
               when Expressions :: [erl_parse:abstract_expr()], Options :: options().

等效于 exprs(Expressions, 0, Options)

链接到此函数

exprs(Expressions, Indent, Options)

查看源代码
-spec exprs(Expressions, Indent, Options) -> io_lib:chars()
               when
                   Expressions :: [erl_parse:abstract_expr()], Indent :: integer(), Options :: options().

form/1,2 相同,但仅适用于 Expressions 中的表达式序列。

-spec form(Form) -> io_lib:chars() when Form :: erl_parse:abstract_form() | erl_parse:form_info().

等效于 form(Form, none)

-spec form(Form, Options) -> io_lib:chars()
              when Form :: erl_parse:abstract_form() | erl_parse:form_info(), Options :: options().

美化打印一个 Form,它是 erl_parse:parse_form/1 返回的抽象形式类型。

-spec function(Function) -> io_lib:chars() when Function :: erl_parse:abstract_form().

等效于 function(Function, none)

链接到此函数

function(Function, Options)

查看源代码
-spec function(Function, Options) -> io_lib:chars()
                  when Function :: erl_parse:abstract_form(), Options :: options().

form/1,2 相同,但仅适用于函数 Function

-spec guard(Guard) -> io_lib:chars() when Guard :: [erl_parse:abstract_expr()].

等效于 guard(Guard, none)

-spec guard(Guard, Options) -> io_lib:chars()
               when Guard :: [erl_parse:abstract_expr()], Options :: options().

form/1,2 相同,但仅适用于 guard 测试 Guard

链接到此函数

legalize_vars(Function)

查看源代码 (自 OTP 25.0 起)
-spec legalize_vars(Function) -> erl_parse:abstract_form() when Function :: erl_parse:abstract_form().

当 Erlang 编译器将记录展开为元组时,会在抽象表示中引入新的变量。由于展开是在抽象表示上完成的,因此编译器可以安全地使用在 Erlang 源代码中语法上无效的名称(名称以小写字母开头)来命名新变量,从而确保新名称的唯一性。

如果用户想使用此模块的函数将抽象表示转换回 Erlang 源代码,则上述策略会导致问题。通常,模式变量会作为原子输出,从而改变程序的语义。为了解决这个问题,在函数的抽象表示上运行 legalize_vars/1 将返回一个等效的函数,其中所有变量都将具有语法上有效的名称。