查看源代码 erl_pp (stdlib v6.2)
Erlang 美化打印器。
此模块中的函数用于生成抽象形式的美观表示,适合打印。所有函数都返回(可能是深层的)字符列表,如果形式错误,则会生成错误。
所有函数都可以有一个可选参数,用于指定一个钩子,如果在尝试打印未知形式时调用该钩子。
请注意,如果此模块中的函数用于将抽象代码转换回 Erlang 源代码,则封闭函数应首先由 legalize_vars/1
处理,以确保输出在语义上等同于抽象代码。
已知限制
在表达式以外的其他地方,无法为未知形式设置钩子函数。
另请参阅
摘要
类型
此模块中描述的函数中显示的可选参数 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 源代码中语法上无效的名称(名称以小写字母开头)来命名新变量,从而确保新名称的唯一性。
类型
-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
为负数,则没有换行符,仅使用空格作为分隔符。
-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 个空格)。
-type options() :: hook_function() | [option()].
函数
-spec attribute(Attribute) -> io_lib:chars() when Attribute :: erl_parse:abstract_form().
-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().
-spec expr(Expression, Options) -> io_lib:chars() when Expression :: erl_parse:abstract_expr(), Options :: options().
-spec expr(Expression, Indent, Options) -> io_lib:chars() when Expression :: erl_parse:abstract_expr(), Indent :: integer(), Options :: 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()].
-spec exprs(Expressions, Options) -> io_lib:chars() when Expressions :: [erl_parse:abstract_expr()], Options :: 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().
-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
。
-spec legalize_vars(Function) -> erl_parse:abstract_form() when Function :: erl_parse:abstract_form().
当 Erlang 编译器将记录展开为元组时,会在抽象表示中引入新的变量。由于展开是在抽象表示上完成的,因此编译器可以安全地使用在 Erlang 源代码中语法上无效的名称(名称以小写字母开头)来命名新变量,从而确保新名称的唯一性。
如果用户想使用此模块的函数将抽象表示转换回 Erlang 源代码,则上述策略会导致问题。通常,模式变量会作为原子输出,从而改变程序的语义。为了解决这个问题,在函数的抽象表示上运行 legalize_vars/1
将返回一个等效的函数,其中所有变量都将具有语法上有效的名称。