查看源代码 cerl (编译器 v8.5.4)

Core Erlang 抽象语法树。

注意

Erlang 编译器的公共接口可以在模块 compile 中找到。

此模块是编译器的内部组成部分。其 API 不保证在不同版本之间保持兼容。

此模块定义了一个抽象数据类型,用于将 Core Erlang 源代码表示为语法树。

对于首次使用的用户,建议的起点是函数 type/1 的文档。

注意

此模块处理语法实体(与语义实体相对)的组成和分解;其目的是隐藏对用于表示这些实体的数据结构的所有直接引用。除了少数例外,此模块中的函数不对其输入执行任何语义解释,并且通常假定用户传递类型正确的参数 - 如果不这样做,则效果未定义。

目前,使用的内部数据结构与 Beam 编译器中传统使用的基于记录的数据结构相同。

抽象语法树的内部表示形式可能会在不通知的情况下进行更改,并且不应在此模块之外进行文档记录。此外,我们不对抽象语法树的表示方式不做任何保证,但以下例外情况除外:任何语法树都不会由单个原子(例如 none)、列表构造函数 [X | Y] 或空列表 [] 表示。在编写对语法树进行操作的函数时,可以依赖这一点。

摘要

函数

创建与 Erlang 项对应的语法树。

Annotations 附加到 Node 的用户注释列表中。

返回抽象模式别名的模式子树。

返回抽象模式别量的变量子树。

另请参阅:c_map_pattern/2

另请参阅:c_nil/0

使用给定的注释、类型和子树创建语法树。

返回抽象函数应用的参数子树列表。

返回抽象函数应用的参数子树的数量。

返回抽象函数应用的操作符子树。

返回由抽象原子表示的文字字符串。这始终包含周围的单引号字符。

返回抽象原子的打印名称。

返回由抽象原子表示的值。

返回抽象二进制模板的段子树列表。

返回抽象位串模板的总比特大小。

返回抽象位串模板的标志子树。

返回抽象位串模板的大小子树。

返回抽象位串模板的类型子树。

返回抽象位串模板的单位子树。

返回抽象位串模板的值子树。

创建抽象模式别名。

创建抽象函数应用。

创建抽象原子文字。

创建抽象二进制模板。

创建抽象位串模板。

创建抽象的模块间调用。

创建抽象的 case 表达式。

创建抽象的 catch 表达式。

创建抽象的字符文字。

创建一个抽象子句。

创建抽象的列表构造函数。

创建抽象的列表构造函数框架。

创建抽象的浮点文字。

创建抽象的 fun 表达式。

创建抽象的整数文字。

创建抽象的 let 表达式。

创建抽象的 letrec 表达式。

创建抽象的 map 构造函数。

创建抽象的 map 更新表达式。

使用 assoc 操作符创建抽象的 map 对。

使用 exact 操作符创建抽象的 map 对。

创建抽象的 map 模式。

创建抽象的模块定义。

创建抽象的空列表。

创建抽象的原始操作调用。

创建抽象的 receive 表达式。

创建抽象的序列表达式。

创建抽象的字符串文字。

创建一个抽象元组。

创建一个抽象元组骨架。

创建一个抽象值列表。

创建一个抽象变量。

返回抽象跨模块调用的参数子树列表。

返回抽象跨模块调用的参数子树的数量。

返回抽象跨模块调用的模块子树。

返回抽象跨模块调用的名称子树。

返回抽象 case 表达式的参数子树。

等价于 clause_arity(hd(case_clauses(Node))),但可能更有效率。

返回抽象 case 表达式的子句子树列表。

返回抽象 catch 表达式的主体子树。

返回由抽象字符表示的文字字符串。 这包括前导 $ 字符。

返回由抽象字符文字表示的值。

返回抽象子句的模式子树的数量。

返回抽象子句的主体子树。

返回抽象子句的守卫子树。

返回抽象子句的模式子树列表。

返回抽象子句模式中所有抽象变量的列表。

返回由语法树表示的 Erlang 项。

返回抽象列表构造器的头部子树。

返回抽象列表构造器的尾部子树。

将用户注释列表从 复制到 目标

返回数据构造器节点的子树数量。

返回数据构造器节点的子树列表。

返回数据构造器节点的类型描述符。(参见 is_data/1。)

返回由浮点文字节点表示的数字字符串。

返回由浮点文字节点表示的值。

返回抽象函数名变量的元数部分。

返回抽象函数名变量的标识符部分。

确保文字具有紧凑的表示形式。

将显式记录表示转换为相应的抽象语法树。

返回抽象 fun 表达式的参数子树的数量。

返回抽象 fun 表达式的主体子树。

返回抽象 fun 表达式的参数子树列表。

返回与语法树节点关联的用户注释列表。

返回由整数文字节点表示的数字字符串。

返回由整数文字节点表示的值。

如果 节点 是抽象模式别名,则返回 true,否则返回 false

如果 节点 是抽象函数应用,则返回 true,否则返回 false

如果 节点 表示原子文字,则返回 true,否则返回 false

如果 节点 是抽象二进制模板,则返回 true,否则返回 false

如果 节点 是抽象位字符串模板,则返回 true,否则返回 false

如果 节点 是抽象跨模块调用表达式,则返回 true,否则返回 false

如果 节点 是抽象 case 表达式,则返回 true,否则返回 false

如果 节点 是抽象 catch 表达式,则返回 true,否则返回 false

如果 节点 可能表示字符文字,则返回 true,否则返回 false

如果 节点 是抽象子句,则返回 true,否则返回 false

如果 节点 是抽象列表构造器,则返回 true,否则返回 false

如果 节点 表示浮点文字,则返回 true,否则返回 false

如果 节点 是抽象函数名变量,则返回 true,否则返回 false

如果 节点 是抽象 fun 表达式,则返回 true,否则返回 false

如果 节点 表示整数文字,则返回 true,否则返回 false

如果 节点 是抽象 let 表达式,则返回 true,否则返回 false

如果 节点 是抽象 letrec 表达式,则返回 true,否则返回 false

如果 节点 表示正确的列表,则返回 true,否则返回 false

如果 节点 是任何类型的抽象映射(用于构造、更新或匹配),则返回 true,否则返回 false

如果 节点 表示空抽象映射,则返回 true,否则返回 false

如果 节点 是抽象映射模式,则返回 true,否则返回 false

如果 节点 是抽象模块定义,则返回 true,否则返回 false

如果 节点 是抽象空列表,则返回 true,否则返回 false

如果 节点 是抽象原始操作调用,则返回 true,否则返回 false

如果 节点 是抽象接收表达式,则返回 true,否则返回 false

如果 节点 是抽象排序表达式,则返回 true,否则返回 false

如果 节点 可能表示字符串文字,则返回 true,否则返回 false

如果 节点 是抽象 try 表达式,则返回 true,否则返回 false

如果 节点 是抽象元组,则返回 true,否则返回 false

如果 节点 是抽象值列表,则返回 true,否则返回 false

如果 节点 是抽象变量,则返回 true,否则返回 false

如果 节点 表示数据构造器,则返回 true,否则返回 false

如果 节点 是叶节点,则返回 true,否则返回 false

如果 节点 表示文字项,则返回 true,否则返回 false

如果 可以表示为文字,则返回 true,否则返回 false

如果 节点 可能表示“可打印”字符,则返回 true,否则返回 false。(参见 is_c_char/1。)

如果 节点 可能表示仅包含“可打印”字符的字符串文字,则返回 true,否则返回 false

返回抽象 let 表达式的参数子树。

返回抽象 let 表达式左侧变量的数量。

返回抽象 let 表达式的主体子树。

返回抽象 let 表达式的左侧变量列表。

返回抽象 letrec 表达式的主体子树。

返回抽象 letrec 表达式的定义列表。

返回 letrec 表达式左侧函数变量子树的列表。

返回抽象列表的元素子树列表。

返回抽象列表的元素子树的数量。

使用指定的类型和子树创建数据构造器节点。(参见 data_type/1。)

列表 中的元素和可选的 尾部 创建抽象列表。

使用给定的类型和子树创建语法树。

返回抽象映射的参数子树。

返回抽象映射的映射对子树列表。

返回抽象映射对的键子树。

返回抽象映射对的操作子树。

返回抽象映射对的值子树。

创建语法树的元表示。

返回抽象模块定义的属性键/值子树对列表。

返回抽象模块定义的函数定义列表。

返回抽象模块定义的导出子树列表。

返回抽象模块定义的名称子树。

返回抽象模块定义的左侧函数变量子树列表。

返回给定模式中所有抽象变量的列表。

返回模式中所有抽象变量的列表。

返回抽象原始操作调用的参数子树列表。

返回抽象原始操作调用的参数子树的数量。

返回抽象原始操作调用的名称子树。

返回抽象接收表达式的动作子树。

返回抽象接收表达式的子句子树列表。

返回抽象接收表达式的超时子树。

返回抽象序列表达式的参数子树。

返回抽象序列表达式的主体子树。

节点 的用户注释列表设置为 注释

返回由抽象字符串表示的字面字符串。这包括周围的双引号字符 "..."

返回由抽象字符串字面量表示的值。

返回节点的所有子树的分组列表。

将抽象语法树转换为相应的显式记录表示。

返回抽象 try 表达式的表达式子树。

返回抽象 try 表达式的成功主体子树。

返回抽象 try 表达式的异常变量子树列表。

返回抽象 try 表达式的异常主体子树。

返回抽象 try 表达式的成功变量子树列表。

返回抽象元组的元素子树的数量。

返回抽象元组的元素子树列表。

返回 节点 的类型标签。

确保字面量具有完全展开的表示形式。

类似于 update_c_fname/3,但从 节点 获取元数。

使用给定的子树创建语法树,并具有与节点 节点 相同的类型和注释。

使用给定的类型和子树创建语法树,并具有与节点 节点 相同的注释。

返回抽象值列表的元素子树的数量。

返回抽象值列表的元素子树列表。

返回抽象变量的名称。

类型

此类型的链接

c_alias()

查看源代码 (未导出)
-type c_alias() :: #c_alias{anno :: list(), var :: cerl:cerl(), pat :: cerl:cerl()}.
此类型的链接

c_apply()

查看源代码 (未导出)
-type c_apply() :: #c_apply{anno :: list(), op :: cerl:cerl(), args :: [cerl:cerl()]}.
-type c_binary() :: #c_binary{anno :: list(), segments :: [cerl:c_bitstr()]}.
-type c_bitstr() ::
          #c_bitstr{anno :: list(),
                    val :: cerl:cerl(),
                    size :: cerl:cerl(),
                    unit :: cerl:cerl(),
                    type :: cerl:cerl(),
                    flags :: cerl:cerl()}.
-type c_call() ::
          #c_call{anno :: list(), module :: cerl:cerl(), name :: cerl:cerl(), args :: [cerl:cerl()]}.
此类型的链接

c_case()

查看源代码 (未导出)
-type c_case() :: #c_case{anno :: list(), arg :: cerl:cerl(), clauses :: [cerl:cerl()]}.
此类型的链接

c_catch()

查看源代码 (未导出)
-type c_catch() :: #c_catch{anno :: list(), body :: cerl:cerl()}.
-type c_clause() ::
          #c_clause{anno :: list(),
                    pats :: [cerl:cerl()],
                    guard :: cerl:cerl(),
                    body :: cerl:cerl() | any()}.
-type c_cons() :: #c_cons{anno :: list(), hd :: cerl:cerl(), tl :: cerl:cerl()}.
-type c_fun() :: #c_fun{anno :: list(), vars :: [cerl:cerl()], body :: cerl:cerl()}.
-type c_lct() :: c_literal() | c_cons() | c_tuple().
-type c_let() :: #c_let{anno :: list(), vars :: [cerl:cerl()], arg :: cerl:cerl(), body :: cerl:cerl()}.
此类型的链接

c_letrec()

查看源代码 (未导出)
-type c_letrec() :: #c_letrec{anno :: list(), defs :: [{cerl:cerl(), cerl:cerl()}], body :: cerl:cerl()}.
-type c_literal() :: #c_literal{anno :: list(), val :: any()}.
-type c_map() ::
          #c_map{anno :: list(),
                 arg :: cerl:c_var() | cerl:c_literal(),
                 es :: [cerl:c_map_pair()],
                 is_pat :: boolean()}.
-type c_map_pair() ::
          #c_map_pair{anno :: list(),
                      op ::
                          #c_literal{val :: assoc, anno :: list()} |
                          #c_literal{val :: exact, anno :: list()},
                      key :: any(),
                      val :: any()}.
-type c_module() ::
          #c_module{anno :: list(),
                    name :: cerl:cerl(),
                    exports :: [cerl:cerl()],
                    attrs :: [{cerl:cerl(), cerl:cerl()}],
                    defs :: [{cerl:cerl(), cerl:cerl()}]}.
此类型的链接

c_opaque()

查看源代码 (未导出)
-type c_opaque() :: #c_opaque{anno :: list(), val :: any()}.
此类型的链接

c_primop()

查看源代码 (未导出)
-type c_primop() :: #c_primop{anno :: list(), name :: cerl:cerl(), args :: [cerl:cerl()]}.
此类型的链接

c_receive()

查看源代码 (未导出)
-type c_receive() ::
          #c_receive{anno :: list(),
                     clauses :: [cerl:cerl()],
                     timeout :: cerl:cerl(),
                     action :: cerl:cerl()}.
-type c_seq() :: #c_seq{anno :: list(), arg :: cerl:cerl() | any(), body :: cerl:cerl()}.
-type c_try() ::
          #c_try{anno :: list(),
                 arg :: cerl:cerl(),
                 vars :: [cerl:cerl()],
                 body :: cerl:cerl(),
                 evars :: [cerl:cerl()],
                 handler :: cerl:cerl()}.
-type c_tuple() :: #c_tuple{anno :: list(), es :: [cerl:cerl()]}.
-type c_values() :: #c_values{anno :: list(), es :: [cerl:cerl()]}.
-type c_var() :: #c_var{anno :: list(), name :: cerl:var_name()}.
-type cerl() ::
          c_alias() |
          c_apply() |
          c_binary() |
          c_bitstr() |
          c_call() |
          c_case() |
          c_catch() |
          c_clause() |
          c_cons() |
          c_fun() |
          c_let() |
          c_letrec() |
          c_literal() |
          c_map() |
          c_map_pair() |
          c_module() |
          c_opaque() |
          c_primop() |
          c_receive() |
          c_seq() |
          c_try() |
          c_tuple() |
          c_values() |
          c_var().
-type ctype() ::
          alias | apply | binary | bitstr | call | 'case' | 'catch' | clause | cons | 'fun' | 'let' |
          letrec | literal | map | map_pair | module | primop | 'receive' | seq | 'try' | tuple |
          values | var.
-type dtype() :: cons | tuple | {atomic, value()}.
此类型的链接

map_op()

查看源代码 (未导出)
-type map_op() :: #c_literal{val :: assoc, anno :: list()} | #c_literal{val :: exact, anno :: list()}.
-type value() :: integer() | float() | atom() | [].
-type var_name() :: integer() | atom() | {atom(), integer()}.

函数

-spec abstract(Term :: term()) -> c_literal().

创建与 Erlang 项对应的语法树。

Term 必须是字面量项,也就是说,它可以表示为源代码字面量。因此,它可能不包含进程标识符、端口、引用、二进制或函数值作为子项。

注意:这是一个常量时间操作。

另请参阅: ann_abstract/2, concrete/1, is_literal/1, is_literal_term/1

此函数的链接

add_ann(Annotations, Node)

查看源代码
-spec add_ann(Annotations :: [term()], Node :: cerl()) -> cerl().

Annotations 附加到 Node 的用户注释列表中。

注意:这等效于 set_ann(Node, Annotations ++ get_ann(Node)),但可能更有效。

另请参阅: get_ann/1, set_ann/2

-spec alias_pat(Node :: c_alias()) -> cerl().

返回抽象模式别名的模式子树。

另请参阅:c_alias/2

-spec alias_var(Node :: c_alias()) -> c_var().

返回抽象模式别量的变量子树。

另请参阅:c_alias/2

此函数的链接

ann_abstract(Annotations, Term)

查看源代码
-spec ann_abstract(Annotations :: [term()], Term :: term()) -> c_literal().

另请参阅:abstract/1

此函数的链接

ann_c_alias(Annotations, Variable, Pattern)

查看源代码
-spec ann_c_alias(Annotations :: [term()], Variable :: c_var(), Pattern :: cerl()) -> c_alias().

另请参阅:c_alias/2

此函数的链接

ann_c_apply(Annotations, Operator, Arguments)

查看源代码
-spec ann_c_apply(Annotations :: [term()], Operator :: cerl(), Arguments :: [cerl()]) -> c_apply().

另请参阅:c_apply/2

此函数的链接

ann_c_atom(Annotations, Name)

查看源代码
-spec ann_c_atom(Annotations :: [term()], Name :: atom() | string()) -> c_literal().

另请参阅:c_atom/1

此函数的链接

ann_c_binary(Annotations, Segments)

查看源代码
-spec ann_c_binary(Annotations :: [term()], Segments :: [cerl()]) -> c_binary().

另请参阅:c_binary/1

此函数的链接

ann_c_bitstr(Annotations, Value, Size, Type, Flags)

查看源代码
-spec ann_c_bitstr(Annotations :: [term()],
                   Value :: cerl(),
                   Size :: cerl(),
                   Type :: cerl(),
                   Flags :: cerl()) ->
                      c_bitstr().

等效于 ann_c_bitstr(As, Value, Size, abstract(1), Type, Flags)

此函数的链接

ann_c_bitstr(Annotations, Value, Size, Unit, Type, Flags)

查看源代码
-spec ann_c_bitstr(Annotations :: [term()],
                   Value :: cerl(),
                   Size :: cerl(),
                   Unit :: cerl(),
                   Type :: cerl(),
                   Flags :: cerl()) ->
                      c_bitstr().

另请参阅:ann_c_bitstr/5c_bitstr/5

此函数的链接

ann_c_call(Annotations, Module, Name, Arguments)

查看源代码
-spec ann_c_call(Annotations :: [term()], Module :: cerl(), Name :: cerl(), Arguments :: [cerl()]) ->
                    c_call().

另请参阅:c_call/3

此函数的链接

ann_c_case(Annotations, Argument, Clauses)

查看源代码
-spec ann_c_case(Annotations :: [term()], Argument :: cerl(), Clauses :: [cerl()]) -> c_case().

另请参阅:c_case/2

此函数的链接

ann_c_catch(Annotations, Body)

查看源代码
-spec ann_c_catch(Annotations :: [term()], Body :: cerl()) -> c_catch().

另请参阅:c_catch/1

此函数的链接

ann_c_char(Annotations, Value)

查看源代码
-spec ann_c_char(Annotations :: [term()], Value :: char()) -> c_literal().

另请参阅:c_char/1

此函数的链接

ann_c_clause(Annotations, Patterns, Body)

查看源代码
-spec ann_c_clause(Annotations :: [term()], Patterns :: [cerl()], Body :: cerl()) -> c_clause().

等效于 ann_c_clause(As, Patterns, c_atom(true), Body)

另请参阅: c_clause/3

此函数的链接

ann_c_clause(Annotations, Patterns, Guard, Body)

查看源代码
-spec ann_c_clause(Annotations :: [term()], Patterns :: [cerl()], Guard :: cerl(), Body :: cerl()) ->
                      c_clause().

另请参阅:ann_c_clause/3c_clause/3

此函数的链接

ann_c_cons(Annotations, Head, Tail)

查看源代码
-spec ann_c_cons(Annotations :: [term()], Head :: cerl(), Tail :: cerl()) -> c_literal() | c_cons().

另请参阅:c_cons/2

此函数的链接

ann_c_cons_skel(Annotations, Head, Tail)

查看源代码
-spec ann_c_cons_skel(Annotations :: [term()], Head :: cerl(), Tail :: cerl()) -> c_cons().

另请参阅:c_cons_skel/2

此函数的链接

ann_c_float(Annotations, Value)

查看源代码
-spec ann_c_float(Annotations :: [term()], Value :: float()) -> c_literal().

另请参阅:c_float/1

此函数的链接

ann_c_fname(Annotations, Name, Arity)

查看源代码
-spec ann_c_fname(Annotations :: [term()], Name :: atom(), Arity :: arity()) -> c_var().

等效于 ann_c_var(As, {Atom, Arity})

另请参阅: c_fname/2

此函数的链接

ann_c_fun(Annotations, Variables, Body)

查看源代码
-spec ann_c_fun(Annotations :: [term()], Variables :: [cerl()], Body :: cerl()) -> c_fun().

另请参阅:c_fun/2

此函数的链接

ann_c_int(Annotations, Value)

查看源代码
-spec ann_c_int(Annotations :: [term()], Value :: integer()) -> c_literal().

另请参阅:c_int/1

此函数的链接

ann_c_let(Annotations, Variables, Argument, Body)

查看源代码
-spec ann_c_let(Annotations :: [term()], Variables :: [cerl()], Argument :: cerl(), Body :: cerl()) ->
                   c_let().

另请参阅:c_let/3

此函数的链接

ann_c_letrec(Annotations, Definitions, Body)

查看源代码
-spec ann_c_letrec(Annotations :: [term()], Definitions :: [{cerl(), cerl()}], Body :: cerl()) ->
                      c_letrec().

另请参阅:c_letrec/2

此函数的链接

ann_c_map(Annotations, Pairs)

查看源代码 (自 OTP 17.0 起)
-spec ann_c_map(Annotations :: [term()], Pairs :: [c_map_pair()]) -> c_map() | c_literal().

另请参阅:c_map/1

此函数的链接

ann_c_map(Annotations, Argument, Pairs)

查看源代码 (自 OTP 17.0 起)
-spec ann_c_map(Annotations :: [term()], Argument :: c_map() | c_literal(), Pairs :: [c_map_pair()]) ->
                   c_map() | c_literal().

另请参阅:c_map/2

此函数的链接

ann_c_map_pair(Annotations, Operation, Key, Value)

查看源代码 (自 OTP 17.0 起)
-spec ann_c_map_pair(Annotations :: [term()], Operation :: cerl(), Key :: cerl(), Value :: cerl()) ->
                        c_map_pair().

另请参阅:c_map_pair/2c_map_pair_exact/2

此函数的链接

ann_c_map_pattern(Annotations, Pairs)

查看源代码 (自 OTP 17.0 起)
-spec ann_c_map_pattern(Annotations :: [term()], Pairs :: [c_map_pair()]) -> c_map().

另请参阅:c_map_pattern/2

此函数的链接

ann_c_module(Annotations, Name, Exports, Definitions)

查看源代码
-spec ann_c_module(Annotations :: [term()],
                   Name :: cerl(),
                   Exports :: [cerl()],
                   Definitions :: [{cerl(), cerl()}]) ->
                      c_module().

另请参阅:ann_c_module/5c_module/3

此函数的链接

ann_c_module(Annotations, Name, Exports, Attributes, Definitions)

查看源代码
-spec ann_c_module(Annotations :: [term()],
                   Name :: cerl(),
                   Exports :: [cerl()],
                   Attributes :: [{cerl(), cerl()}],
                   Definitions :: [{cerl(), cerl()}]) ->
                      c_module().

另请参阅:ann_c_module/4c_module/4

此函数的链接

ann_c_nil(Annotations)

查看源代码
-spec ann_c_nil(Annotations :: [term()]) -> c_literal().

另请参阅:c_nil/0

此函数的链接

ann_c_primop(Annotations, Name, Arguments)

查看源代码
-spec ann_c_primop(Annotations :: [term()], Name :: cerl(), Arguments :: [cerl()]) -> c_primop().

另请参阅:c_primop/2

此函数的链接

ann_c_receive(Annotations, Clauses)

查看源代码
-spec ann_c_receive(Annotations :: [term()], Clauses :: [cerl()]) -> c_receive().

等效于 ann_c_receive(As, Clauses, c_atom(infinity), c_atom(true))

另请参阅: c_atom/1, c_receive/3

此函数的链接

ann_c_receive(Annotations, Clauses, Timeout, Actions)

查看源代码
-spec ann_c_receive(Annotations :: [term()], Clauses :: [cerl()], Timeout :: cerl(), Actions :: cerl()) ->
                       c_receive().

另请参阅:ann_c_receive/2c_receive/3

此函数的链接

ann_c_seq(Annotations, Argument, Body)

查看源代码
-spec ann_c_seq(Annotations :: [term()], Argument :: cerl(), Body :: cerl()) -> c_seq().

另请参阅:c_seq/2

此函数的链接

ann_c_string(Annotations, Value)

查看源代码
-spec ann_c_string(Annotations :: [term()], Value :: string()) -> c_literal().

另请参阅:c_string/1

此函数的链接

ann_c_try(Annotations, Argument, Variables, Body, ExceptionVars, Handler)

查看源代码
-spec ann_c_try(Annotations :: [term()],
                Argument :: cerl(),
                Variables :: [cerl()],
                Body :: cerl(),
                ExceptionVars :: [cerl()],
                Handler :: cerl()) ->
                   c_try().

另请参阅:c_try/5

此函数的链接

ann_c_tuple(Annotations, Elements)

查看源代码
-spec ann_c_tuple(Annotations :: [term()], Elements :: [cerl()]) -> c_tuple() | c_literal().

另请参阅:c_tuple/1

此函数的链接

ann_c_tuple_skel(Annotations, Elements)

查看源代码
-spec ann_c_tuple_skel(Annotations :: [term()], Elements :: [cerl()]) -> c_tuple().

另请参阅:c_tuple_skel/1

此函数的链接

ann_c_values(Annotations, Values)

查看源代码
-spec ann_c_values(Annotations :: [term()], Values :: [cerl()]) -> c_values().

另请参阅:c_values/1

此函数的链接

ann_c_var(Annotations, Name)

查看源代码
-spec ann_c_var(Annotations :: [term()], Name :: var_name()) -> c_var().

另请参阅:c_var/1

此函数的链接

ann_make_data(Annotations, Type, Elementes)

查看源代码
-spec ann_make_data(Annotations :: [term()], Type :: dtype(), Elementes :: [cerl()]) -> c_lct().

另请参阅:make_data/2

此函数的链接

ann_make_data_skel(Annotations, Type, Elements)

查看源代码
-spec ann_make_data_skel(Annotations :: [term()], Type :: dtype(), Elements :: [cerl()]) -> c_lct().

另请参阅:make_data_skel/2

此函数的链接

ann_make_list(Annotations, List)

查看源代码
-spec ann_make_list(Annotations :: [term()], List :: [cerl()]) -> cerl().

等效于 ann_make_list(As, List, none)

此函数的链接

ann_make_list(Annotations, List, Tail)

查看源代码
-spec ann_make_list(Annotations :: [term()], List :: [cerl()], Tail :: cerl() | none) -> cerl().

另请参阅:ann_make_list/2make_list/2

此函数的链接

ann_make_tree(Annotations, Type, Groups)

查看源代码
-spec ann_make_tree(Annotations :: [term()], Type :: ctype(), Groups :: [[cerl()], ...]) -> cerl().

使用给定的注释、类型和子树创建语法树。

有关详细信息,请参见 make_tree/2

另请参阅: make_tree/2

-spec apply_args(Node :: c_apply()) -> [cerl()].

返回抽象函数应用的参数子树列表。

另请参阅: apply_arity/1, c_apply/2

-spec apply_arity(Node :: c_apply()) -> arity().

返回抽象函数应用的参数子树的数量。

注意:这等效于 length(apply_args(Node)),但可能更有效。

另请参阅: apply_args/1, c_apply/2

-spec apply_op(Node :: c_apply()) -> cerl().

返回抽象函数应用的操作符子树。

另请参阅:c_apply/2

-spec atom_lit(Node :: cerl()) -> nonempty_string().

返回由抽象原子表示的文字字符串。这始终包含周围的单引号字符。

请注意,抽象原子可能具有多个字面量表示形式,并且此函数产生的表示形式是不固定的;例如,atom_lit(c_atom("a\012b")) 可能会产生字符串 "\'a\\nb\'"

另请参阅:c_atom/1

-spec atom_name(Node :: c_literal()) -> string().

返回抽象原子的打印名称。

另请参阅:c_atom/1

-spec atom_val(Node :: c_literal()) -> atom().

返回由抽象原子表示的值。

另请参阅:c_atom/1

-spec binary_segments(Node :: c_binary()) -> [cerl()].

返回抽象二进制模板的段子树列表。

另请参阅: c_binary/1, c_bitstr/5

-spec bitstr_bitsize(Node :: c_bitstr()) -> all | any | utf | non_neg_integer().

返回抽象位串模板的总比特大小。

如果大小字段是整数字面量,则结果是大小和单位值的乘积;如果大小字段是原子字面量 all,则返回原子 all。如果大小不是字面量,则返回原子 any。如果位字符串段的类型是 utf8utf16utf32 之一,则返回原子 utf

另请参阅: c_bitstr/5

-spec bitstr_flags(Node :: c_bitstr()) -> cerl().

返回抽象位串模板的标志子树。

另请参阅: c_bitstr/5

-spec bitstr_size(Node :: c_bitstr()) -> cerl().

返回抽象位串模板的大小子树。

另请参阅: c_bitstr/5

-spec bitstr_type(Node :: c_bitstr()) -> cerl().

返回抽象位串模板的类型子树。

另请参阅: c_bitstr/5

-spec bitstr_unit(Node :: c_bitstr()) -> cerl().

返回抽象位串模板的单位子树。

另请参阅: c_bitstr/5

-spec bitstr_val(Node :: c_bitstr()) -> cerl().

返回抽象位串模板的值子树。

另请参阅: c_bitstr/5

此函数的链接

c_alias(Variable, Pattern)

查看源代码
-spec c_alias(Variable :: c_var(), Pattern :: cerl()) -> c_alias().

创建抽象模式别名。

结果表示“Variable = Pattern”。

另请参阅:alias_pat/1alias_var/1ann_c_alias/3c_clause/3is_c_alias/1update_c_alias/3

此函数的链接

c_apply(Operator, Arguments)

查看源代码
-spec c_apply(Operator :: cerl(), Arguments :: [cerl()]) -> c_apply().

创建抽象函数应用。

如果 Arguments[A1, ..., An],则结果表示“apply Operator(A1, ..., An)”。

另请参阅:ann_c_apply/3apply_args/1apply_arity/1apply_op/1c_call/3c_primop/2is_c_apply/1update_c_apply/3

-spec c_atom(Name :: atom() | string()) -> c_literal().

创建抽象原子文字。

原子打印名称是由 Name 表示的字符序列。

注意:将字符串作为参数传递给此函数会导致为内部表示创建相应的原子。

另请参阅:ann_c_atom/2atom_lit/1atom_name/1atom_val/1is_c_atom/1

-spec c_binary(Segments :: [cerl()]) -> c_binary().

创建抽象二进制模板。

在此上下文中,二进制对象是任意数量的位序列。(过去,使用的位数可以被 8 整除,但在 Erlang 语言中引入位串之后,选择对所有位串使用二进制模板。)它由零个或多个任意长度(以位数计)的位串模板指定。

如果 Segments[S1, ..., Sn],则结果表示“#{S1, ..., Sn}#”。所有 Si 必须具有类型 bitstr

另请参阅:ann_c_binary/2binary_segments/1c_bitstr/5is_c_binary/1update_c_binary/2

此函数的链接

c_bitstr(Value, Type, Flags)

查看源代码
-spec c_bitstr(Value :: cerl(), Type :: cerl(), Flags :: cerl()) -> c_bitstr().

等效于 c_bitstr(Value, abstract(all), abstract(1), Type, Flags)

此函数的链接

c_bitstr(Value, Size, Type, Flags)

查看源代码
-spec c_bitstr(Value :: cerl(), Size :: cerl(), Type :: cerl(), Flags :: cerl()) -> c_bitstr().

等效于 c_bitstr(Value, Size, abstract(1), Type, Flags)

此函数的链接

c_bitstr(Value, Size, Unit, Type, Flags)

查看源代码
-spec c_bitstr(Value :: cerl(), Size :: cerl(), Unit :: cerl(), Type :: cerl(), Flags :: cerl()) ->
                  c_bitstr().

创建抽象位串模板。

这些只能作为抽象二进制模板的组件出现(请参阅 c_binary/1)。结果表示“#<Value>(Size, Unit, Type, Flags)”,其中 Unit 必须表示正整数常量,Type 必须表示常量原子('integer''float''binary''utf8''utf16''utf32' 中的一个),并且 Flags 必须表示常量列表 "[F1, ..., Fn]",其中所有 Fi 都是原子。

另请参阅:ann_c_bitstr/6bitstr_flags/1bitstr_size/1bitstr_type/1bitstr_unit/1bitstr_val/1c_binary/1is_c_bitstr/1update_c_bitstr/6

此函数的链接

c_call(Module, Name, Arguments)

查看源代码
-spec c_call(Module :: cerl(), Name :: cerl(), Arguments :: [cerl()]) -> c_call().

创建抽象的模块间调用。

如果 Arguments[A1, ..., An],则结果表示“call Module:Name(A1, ..., An)”。

另请参阅:ann_c_call/4c_apply/2c_primop/2call_args/1call_arity/1call_module/1call_name/1is_c_call/1update_c_call/4

此函数的链接

c_case(Argument, Clauses)

查看源代码
-spec c_case(Argument :: cerl(), Clauses :: [cerl()]) -> c_case().

创建抽象的 case 表达式。

如果 Clauses[C1, ..., Cn],则结果表示“case Argument of C1 ... Cn end”。Clauses 不得为空。

另请参阅:ann_c_case/3c_clause/3case_arg/1case_arity/1case_clauses/1is_c_case/1update_c_case/3

-spec c_catch(Body :: cerl()) -> c_catch().

创建抽象的 catch 表达式。

结果表示“catch Body”。

注意:catch 表达式可以重写为 try 表达式,并最终将从 Core Erlang 中删除。

另请参阅:ann_c_catch/2c_try/5catch_body/1is_c_catch/1update_c_catch/2

-spec c_char(Value :: non_neg_integer()) -> c_literal().

创建抽象的字符文字。

如果 Erlang 的本地实现将 char/0 定义为 integer/0 的子集,则此函数等效于 c_int/1。否则,如果给定值是整数,它将转换为具有相应代码的字符。字符的词法表示为“$Char”,其中 Char 是单个打印字符或转义序列。

另请参阅:ann_c_char/2c_int/1c_string/1char_lit/1char_val/1is_c_char/1is_print_char/1

此函数的链接

c_clause(Patterns, Body)

查看源代码
-spec c_clause(Patterns :: [cerl()], Body :: cerl()) -> c_clause().

等效于 c_clause(Patterns, c_atom(true), Body)

另请参阅:c_atom/1

此函数的链接

c_clause(Patterns, Guard, Body)

查看源代码
-spec c_clause(Patterns :: [cerl()], Guard :: cerl(), Body :: cerl()) -> c_clause().

创建一个抽象子句。

如果 Patterns[P1, ..., Pn],则结果表示“<P1, ..., Pn> when Guard -> Body”。

另请参阅:ann_c_clause/4c_case/2c_clause/2c_receive/3clause_arity/1clause_body/1clause_guard/1clause_pats/1clause_vars/1is_c_clause/1update_c_clause/4

-spec c_cons(Head :: cerl(), Tail :: cerl()) -> c_literal() | c_cons().

创建抽象的列表构造函数。

结果表示“[Head | Tail]”。请注意,如果 HeadTail 都具有类型 literal,则结果也将具有类型 literal,并且 HeadTail 上的注释将丢失。

回想一下,在 Erlang 中,列表构造函数的尾部元素不一定是列表。

另请参阅:ann_c_cons/3c_cons_skel/2c_nil/0cons_hd/1cons_tl/1is_c_cons/1is_c_list/1list_elements/1list_length/1make_list/2update_c_cons/3

此函数的链接

c_cons_skel(Head, Tail)

查看源代码
-spec c_cons_skel(Head :: cerl(), Tail :: cerl()) -> c_cons().

创建抽象的列表构造函数框架。

不折叠常量字面量,也就是说,结果始终具有类型 cons,表示“[Head | Tail]”。

当需要对列表构造函数节点的子节点进行注释时,即使子节点是常量字面量,此函数也偶尔有用。但是,请注意,如果将此函数的结果传递给 is_literal/1,则会产生 false,如果传递给 concrete/1,则会失败。

fold_literal/1 可用于将节点恢复为标准形式表示。

另请参阅:ann_c_cons_skel/3c_cons/2c_nil/0concrete/1fold_literal/1is_c_cons/1is_c_list/1is_literal/1update_c_cons_skel/3

-spec c_float(Value :: float()) -> c_literal().

创建抽象的浮点文字。

词法表示为 Value 的十进制浮点数。

另请参阅:ann_c_float/2float_lit/1float_val/1is_c_float/1

-spec c_fname(Name :: atom(), Arity :: arity()) -> c_var().

等效于 c_var({Name, Arity})

另请参阅:ann_c_fname/3fname_arity/1fname_id/1is_c_fname/1update_c_fname/3

此函数的链接

c_fun(Variables, Body)

查看源代码
-spec c_fun(Variables :: [cerl()], Body :: cerl()) -> c_fun().

创建抽象的 fun 表达式。

如果 Variables[V1, ..., Vn],则结果表示“fun (V1, ..., Vn) -> Body”。所有 Vi 必须具有类型 var

另请参阅:ann_c_fun/3fun_arity/1fun_body/1fun_vars/1is_c_fun/1update_c_fun/3

-spec c_int(Value :: integer()) -> c_literal().

创建抽象的整数文字。

词法表示为 Value 的规范十进制数。

另请参阅:ann_c_int/2c_char/1int_lit/1int_val/1is_c_int/1

此函数的链接

c_let(Variables, Argument, Body)

查看源代码
-spec c_let(Variables :: [cerl()], Argument :: cerl(), Body :: cerl()) -> c_let().

创建抽象的 let 表达式。

如果 Variables[V1, ..., Vn],则结果表示“let <V1, ..., Vn> = Argument in Body”。所有 Vi 必须具有类型 var

另请参阅:ann_c_let/4is_c_let/1let_arg/1let_arity/1let_body/1let_vars/1update_c_let/4

此函数的链接

c_letrec(Definitions, Body)

查看源代码
-spec c_letrec(Definitions :: [{cerl(), cerl()}], Body :: cerl()) -> c_letrec().

创建抽象的 letrec 表达式。

如果 Definitions[{V1, F1}, ..., {Vn, Fn}],则结果表示“letrec V1 = F1 ... Vn = Fn in Body”。所有 Vi 必须具有类型 var 并且表示函数名称。所有 Fi 必须具有类型 'fun'

另请参阅:ann_c_letrec/3is_c_letrec/1letrec_body/1letrec_defs/1letrec_vars/1update_c_letrec/3

此函数的链接

c_map(Pairs)

查看源代码 (自 OTP 17.0 起)
-spec c_map(Pairs :: [c_map_pair()]) -> c_map().

创建抽象的 map 构造函数。

如果 Pairs[E1, ..., EN],则结果表示“~{E1, ..., EN}~”(创建一个新映射)。请注意,如果 Pairs 中的所有对的键和值都具有类型 literal,或者如果 Pairs 为空,则结果也将具有类型 literal,并且 Pairs 中节点的注释将丢失。

所有 Ei 必须是由 c_map_pair/2 构造的抽象对。

另请参阅:ann_c_map/2is_c_map/1is_c_map_empty/1is_c_map_pattern/1map_es/1c_map_pair/2c_map_pair_exact/2

此函数的链接

c_map(Argument, Pairs)

查看源码 (自 OTP 27.0 起)
-spec c_map(Argument :: cerl(), Pairs :: [c_map_pair()]) -> c_map().

创建抽象的 map 更新表达式。

如果 Pairs[E1, ..., EN],则结果表示“~{E1, ..., EN | Argument}~”(更新现有映射)。请注意,如果 Argument 是一个字面量,并且 Pairs 中的所有对的键和值都具有 literal 类型,或者如果 Pairs 为空,则结果也将具有 literal 类型,并且 Pairs 中节点的注释将丢失。

所有 Ei 都必须是由 c_map_pair/2c_map_pair_exact/2 构造的抽象对。

另请参阅:ann_c_map/2is_c_map/1is_c_map_empty/1is_c_map_pattern/1map_es/1c_map_pair/2c_map_pair_exact/2

此函数的链接

c_map_pair(Key, Value)

查看源码 (自 OTP 17.0 起)
-spec c_map_pair(Key :: cerl(), Value :: cerl()) -> c_map_pair().

使用 assoc 操作符创建抽象的 map 对。

这些只能作为抽象映射创建表达式或抽象更新表达式的组成部分出现(请参阅 c_map/1c_map/2)。

结果表示“Key => Value”。

另请参阅:map_pair_key/1map_pair_op/1map_pair_val/1

此函数的链接

c_map_pair_exact(Key, Value)

查看源码 (自 OTP 17.0 起)
-spec c_map_pair_exact(Key :: cerl(), Value :: cerl()) -> c_map_pair().

使用 exact 操作符创建抽象的 map 对。

这些只能作为抽象映射更新表达式或抽象映射模式的组成部分出现(请参阅 c_map/1c_map_pattern/1)。

结果表示“Key := Value”。

另请参阅:map_pair_key/1map_pair_op/1map_pair_val/1

此函数的链接

c_map_pattern(Pairs)

查看源码 (自 OTP 17.0 起)
-spec c_map_pattern(Pairs :: [c_map_pair()]) -> c_map().

创建抽象的 map 模式。

如果 Pairs[E1, ..., EN],则结果表示“~{E1, ..., EN}~”。

所有 Ei 都必须是由 c_map_pair_exact/2 构造的抽象对。

另请参阅:ann_c_map/2is_c_map/1is_c_map_empty/1is_c_map_pattern/1map_es/1c_map_pair_exact/2

此函数的链接

c_module(Name, Exports, Definitions)

查看源代码
-spec c_module(Name :: cerl(), Exports :: [cerl()], Definitions :: [{cerl(), cerl()}]) -> c_module().

等效于 c_module(Name, Exports, [], Definitions)

此函数的链接

c_module(Name, Exports, Attributes, Definitions)

查看源代码
-spec c_module(Name :: cerl(),
               Exports :: [cerl()],
               Attributes :: [{cerl(), cerl()}],
               Definitions :: [{cerl(), cerl()}]) ->
                  c_module().

创建抽象的模块定义。

结果表示

    module Name [E1, ..., Ek]
      attributes [K1 = T1, ...,
                  Km = Tm]
      V1 = F1
      ...
      Vn = Fn
    end

如果 Exports = [E1, ..., Ek]Attributes = [{K1, T1}, ..., {Km, Tm}],并且 Definitions = [{V1, F1}, ..., {Vn, Fn}]

Name 和所有 Ki 必须是原子字面量,并且所有 Ti 必须是常量字面量。所有 ViEi 都必须具有 var 类型,并表示函数名称。所有 Fi 都必须具有 'fun' 类型。

另请参阅:ann_c_module/4ann_c_module/5c_atom/1c_fun/2c_module/3c_var/1is_literal/1module_attrs/1module_defs/1module_exports/1module_name/1module_vars/1update_c_module/5

-spec c_nil() -> c_literal().

创建抽象的空列表。

结果表示“[]”。空列表通常称为“nil”。

另请参阅:ann_c_nil/1c_cons/2is_c_list/1

此函数的链接

c_primop(Name, Arguments)

查看源代码
-spec c_primop(Name :: cerl(), Arguments :: [cerl()]) -> c_primop().

创建抽象的原始操作调用。

如果 Arguments[A1, ..., An],则结果表示“primop Name(A1, ..., An)”。Name 必须是原子字面量。

另请参阅:ann_c_primop/3c_apply/2c_call/3is_c_primop/1primop_args/1primop_arity/1primop_name/1update_c_primop/3

-spec c_receive(Clauses :: [cerl()]) -> c_receive().

等效于 c_receive(Clauses, c_atom(infinity), c_atom(true))

另请参阅:c_atom/1

此函数的链接

c_receive(Clauses, Timeout, Action)

查看源代码
-spec c_receive(Clauses :: [cerl()], Timeout :: cerl(), Action :: cerl()) -> c_receive().

创建抽象的 receive 表达式。

如果 Clauses[C1, ..., Cn],则结果表示“receive C1 ... Cn after Timeout -> Action end”。

另请参阅:ann_c_receive/4c_receive/1is_c_receive/1receive_action/1receive_clauses/1receive_timeout/1update_c_receive/4

-spec c_seq(Argument :: cerl(), Body :: cerl()) -> c_seq().

创建抽象的序列表达式。

结果表示“do Argument Body”。

另请参阅:ann_c_seq/3is_c_seq/1seq_arg/1seq_body/1update_c_seq/3

-spec c_string(Value :: string()) -> c_literal().

创建抽象的字符串文字。

等效于创建相应字符字面量的抽象列表(参见 is_c_string/1),但通常更有效率。字符串的词法表示形式为“"Chars"”,其中 Chars 是打印字符或空格的序列。

另请参阅:ann_c_string/2c_char/1is_c_string/1is_print_string/1string_lit/1string_val/1

此函数的链接

c_try(Argument, Variables, Body, ExceptionVars, Handler)

查看源代码
-spec c_try(Argument :: cerl(),
            Variables :: [cerl()],
            Body :: cerl(),
            ExceptionVars :: [cerl()],
            Handler :: cerl()) ->
               c_try().

创建抽象的 try 表达式。

如果 Variables[V1, ..., Vn] 并且 ExceptionVars[X1, ..., Xm],则结果表示“try Argument of <V1, ..., Vn> -> Body catch <X1, ..., Xm> -> Handler”。所有 ViXi 都必须具有 var 类型。

另请参阅:ann_c_try/6c_catch/1is_c_try/1try_arg/1try_body/1try_vars/1update_c_try/6

-spec c_tuple(Elements :: [cerl()]) -> c_tuple() | c_literal().

创建一个抽象元组。

如果 Elements[E1, ..., En],则结果表示“{E1, ..., En}”。请注意,如果 Elements 中的所有节点都具有 literal 类型,或者如果 Elements 为空,则结果也将具有 literal 类型,并且 Elements 中节点的注释将丢失。

请记住,Erlang 具有不同的 1 元组,即 {X} 始终与 X 本身不同。

另请参阅:ann_c_tuple/2c_tuple_skel/1is_c_tuple/1tuple_arity/1tuple_es/1update_c_tuple/2

-spec c_tuple_skel(Elements :: [cerl()]) -> c_tuple().

创建一个抽象元组骨架。

不折叠常量字面量,也就是说,如果 Elements[E1, ..., En],则结果始终具有 tuple 类型,表示“{E1, ..., En}”。

当需要对元组节点的子节点进行注释时,即使所有子节点都是常量字面量,此函数有时也很有用。但是请注意,如果将此函数的结果传递给 is_literal/1,则将产生 false,并且如果将此函数的结果传递给 concrete/1,则会失败。

fold_literal/1 可用于将节点恢复为标准形式表示。

另请参阅:ann_c_tuple_skel/2c_tuple/1concrete/1fold_literal/1is_c_tuple/1is_literal/1tuple_es/1update_c_tuple_skel/2

-spec c_values(Elements :: [cerl()]) -> c_values().

创建一个抽象值列表。

如果 Elements[E1, ..., En],则结果表示“<E1, ..., En>”。

另请参阅:ann_c_values/2is_c_values/1update_c_values/2values_arity/1values_es/1

-spec c_var(Name :: var_name()) -> c_var().

创建一个抽象变量。

变量由其名称标识,名称由 Name 参数给出。

如果名称由单个原子给出,则它应该是一个“简单”原子,不需要在 Erlang 中用单引号引起来,否则其打印名称应对应于正确的 Erlang 变量,即以大写字母或下划线开头。形式为 {A, N} 的名称表示函数名变量“A/N”;这些是特殊变量,只能在模块的函数定义或 letrec 中绑定。它们不能在 let 表达式中绑定,也不能出现在子句模式中。函数名称中的原子 A 可以是任何原子;整数 N 必须是非负数。函数 c_fname/2 等是用于处理函数名称变量的实用程序。

打印变量名时,它们必须符合 Core Erlang 变量和函数名的形式。例如,一个由整数表示的名称,如 42,可以格式化为 "_42";一个原子 'Xxx' 可以简单地格式化为 "Xxx";而一个原子 foo 可以格式化为 "_foo"。但是,必须确保任何两个有效的不同名称永远不会映射到相同的字符串。表示函数名的元组,如 {foo, 2},可以简单地格式化为 "'foo'/2",不会有冲突的风险。

另请参阅: ann_c_var/2c_fname/2c_letrec/2c_module/4is_c_var/1update_c_var/2var_name/1

-spec call_args(Node :: c_call()) -> [cerl()].

返回抽象跨模块调用的参数子树列表。

另请参阅: c_call/3call_arity/1

-spec call_arity(Node :: c_call()) -> arity().

返回抽象跨模块调用的参数子树的数量。

注意:这等效于 length(call_args(Node)),但可能更高效。

另请参阅: c_call/3call_args/1

-spec call_module(Node :: c_call()) -> cerl().

返回抽象跨模块调用的模块子树。

另请参阅:c_call/3

-spec call_name(Node :: c_call()) -> cerl().

返回抽象跨模块调用的名称子树。

另请参阅:c_call/3

-spec case_arg(Node :: c_case()) -> cerl().

返回抽象 case 表达式的参数子树。

另请参阅:c_case/2

-spec case_arity(Node :: c_case()) -> non_neg_integer().

等价于 clause_arity(hd(case_clauses(Node))),但可能更有效率。

另请参阅: c_case/2case_clauses/1clause_arity/1

-spec case_clauses(Node :: c_case()) -> [cerl()].

返回抽象 case 表达式的子句子树列表。

另请参阅: c_case/2case_arity/1

-spec catch_body(Node :: c_catch()) -> cerl().

返回抽象 catch 表达式的主体子树。

另请参阅:c_catch/1

-spec char_lit(Node :: c_literal()) -> nonempty_string().

返回由抽象字符表示的文字字符串。 这包括前导 $ 字符。

当前,所有不在 ISO 8859-1 (Latin-1) "可打印" 字符集中的字符都将被转义。

另请参阅:c_char/1

-spec char_val(Node :: c_literal()) -> char().

返回由抽象字符文字表示的值。

另请参阅:c_char/1

-spec clause_arity(Node :: c_clause()) -> non_neg_integer().

返回抽象子句的模式子树的数量。

注意:这等效于 length(clause_pats(Node)),但可能更高效。

另请参阅: c_clause/3clause_pats/1

-spec clause_body(Node :: c_clause()) -> cerl().

返回抽象子句的主体子树。

另请参阅: c_clause/3

-spec clause_guard(Node :: c_clause()) -> cerl().

返回抽象子句的守卫子树。

另请参阅: c_clause/3

-spec clause_pats(Node :: c_clause()) -> [cerl()].

返回抽象子句的模式子树列表。

另请参阅: c_clause/3clause_arity/1

-spec clause_vars(Node :: c_clause()) -> [cerl()].

返回抽象子句模式中所有抽象变量的列表。

列表的顺序未定义。

另请参阅: c_clause/3pat_list_vars/1

-spec concrete(Node :: c_literal()) -> term().

返回由语法树表示的 Erlang 项。

如果 Node 不表示字面量,则会抛出异常。

注意:这是一个常量时间操作。

另请参阅: abstract/1is_literal/1

-spec cons_hd(Node :: c_cons() | c_literal()) -> cerl().

返回抽象列表构造器的头部子树。

另请参阅:c_cons/2

-spec cons_tl(Node :: c_cons() | c_literal()) -> cerl().

返回抽象列表构造器的尾部子树。

请记住,尾部不一定代表一个正确的列表。

另请参阅:c_cons/2

-spec copy_ann(Source :: cerl(), Target :: cerl()) -> cerl().

将用户注释列表从 复制到 目标

注意:这等效于 set_ann(Target, get_ann(Source)),但可能更高效。

另请参阅: get_ann/1, set_ann/2

-spec data_arity(Node :: c_lct()) -> non_neg_integer().

返回数据构造器节点的子树数量。

这等效于 length(data_es(Node)),但可能更高效。

另请参阅: data_es/1is_data/1

-spec data_es(Node :: c_lct()) -> [cerl()].

返回数据构造器节点的子树列表。

如果构造函数的元数为零,则结果为空列表。

注意:如果 data_type(Node)cons,则子树的数量恰好为两个。如果 data_type(Node){atomic, Value},则子树的数量为零。

另请参阅: data_arity/1data_type/1is_data/1make_data/2

-spec data_type(Node :: c_lct()) -> dtype().

返回数据构造器节点的类型描述符。(参见 is_data/1。)

这主要用于比较类型和构造相同类型的新节点(参见 make_data/2)。如果 Node 表示整数、浮点数、原子或空列表,则结果为 {atomic, Value},其中 Valueconcrete(Node) 的值,否则结果为 constuple

类型描述符可以比较相等性或顺序(在 Erlang 术语顺序中),但请记住,浮点数值通常永远不应测试相等性。

另请参阅: concrete/1is_data/1make_data/2type/1

-spec float_lit(Node :: c_literal()) -> string().

返回由浮点文字节点表示的数字字符串。

另请参阅:c_float/1

-spec float_val(Node :: c_literal()) -> float().

返回由浮点文字节点表示的值。

另请参阅:c_float/1

-spec fname_arity(Node :: c_var()) -> arity().

返回抽象函数名变量的元数部分。

另请参阅: c_fname/2fname_id/1

-spec fname_id(Node :: c_var()) -> atom().

返回抽象函数名变量的标识符部分。

另请参阅: c_fname/2fname_arity/1

-spec fold_literal(Node :: cerl()) -> cerl().

确保文字具有紧凑的表示形式。

如果 Node 的构造使用了 c_cons_skel/2c_tuple_skel/1unfold_literal/1,并且您想恢复为字面量的正常“折叠”表示形式,则这有时很有用。如果 Node 表示元组或列表构造函数,则其元素将被递归重写,并且该节点将分别使用 c_cons/2c_tuple/1 重构;否则,Node 不会改变。

另请参阅: c_cons/2c_cons_skel/2c_tuple/1c_tuple_skel/1is_literal/1unfold_literal/1

-spec from_records(Node :: cerl()) -> cerl().

将显式记录表示转换为相应的抽象语法树。

记录在文件 "core_parse.hrl" 中定义。

另请参阅: to_records/1type/1

-spec fun_arity(Node :: c_fun()) -> arity().

返回抽象 fun 表达式的参数子树的数量。

注意:这等效于 length(fun_vars(Node)),但可能更高效。

另请参阅: c_fun/2fun_vars/1

-spec fun_body(Node :: c_fun()) -> cerl().

返回抽象 fun 表达式的主体子树。

另请参阅:c_fun/2

-spec fun_vars(Node :: c_fun()) -> [cerl()].

返回抽象 fun 表达式的参数子树列表。

另请参阅: c_fun/2fun_arity/1

-spec get_ann(Node :: cerl()) -> [term()].

返回与语法树节点关联的用户注释列表。

对于新创建的节点,这是一个空列表。注解可以是任何术语。

另请参阅: set_ann/2

-spec int_lit(Node :: c_literal()) -> string().

返回由整数文字节点表示的数字字符串。

另请参阅:c_int/1

-spec int_val(Node :: c_literal()) -> integer().

返回由整数文字节点表示的值。

另请参阅:c_int/1

-spec is_c_alias(Node :: cerl()) -> boolean().

如果 节点 是抽象模式别名,则返回 true,否则返回 false

另请参阅:c_alias/2

-spec is_c_apply(Node :: cerl()) -> boolean().

如果 节点 是抽象函数应用,则返回 true,否则返回 false

另请参阅:c_apply/2

-spec is_c_atom(Node :: cerl()) -> boolean().

如果 节点 表示原子文字,则返回 true,否则返回 false

另请参阅:c_atom/1

-spec is_c_binary(Node :: cerl()) -> boolean().

如果 节点 是抽象二进制模板,则返回 true,否则返回 false

另请参阅:c_binary/1

-spec is_c_bitstr(Node :: cerl()) -> boolean().

如果 节点 是抽象位字符串模板,则返回 true,否则返回 false

另请参阅: c_bitstr/5

-spec is_c_call(Node :: cerl()) -> boolean().

如果 节点 是抽象跨模块调用表达式,则返回 true,否则返回 false

另请参阅:c_call/3

-spec is_c_case(Node :: cerl()) -> boolean().

如果 节点 是抽象 case 表达式,则返回 true,否则返回 false

另请参阅:c_case/2

-spec is_c_catch(Node :: cerl()) -> boolean().

如果 节点 是抽象 catch 表达式,则返回 true,否则返回 false

另请参阅:c_catch/1

-spec is_c_char(Node :: c_literal()) -> boolean().

如果 节点 可能表示字符文字,则返回 true,否则返回 false

如果 Erlang 的本地实现将 char/0 定义为 integer/0 的子集,则 is_c_int(Node) 也会产生 true

另请参阅: c_char/1is_print_char/1

-spec is_c_clause(Node :: cerl()) -> boolean().

如果 节点 是抽象子句,则返回 true,否则返回 false

另请参阅: c_clause/3

-spec is_c_cons(Node :: cerl()) -> boolean().

如果 节点 是抽象列表构造器,则返回 true,否则返回 false

-spec is_c_float(Node :: cerl()) -> boolean().

如果 节点 表示浮点文字,则返回 true,否则返回 false

另请参阅:c_float/1

-spec is_c_fname(Node :: cerl()) -> boolean().

如果 节点 是抽象函数名变量,则返回 true,否则返回 false

另请参阅: c_fname/2c_var/1var_name/1

-spec is_c_fun(Node :: cerl()) -> boolean().

如果 节点 是抽象 fun 表达式,则返回 true,否则返回 false

另请参阅:c_fun/2

-spec is_c_int(Node :: cerl()) -> boolean().

如果 节点 表示整数文字,则返回 true,否则返回 false

另请参阅:c_int/1

-spec is_c_let(Node :: cerl()) -> boolean().

如果 节点 是抽象 let 表达式,则返回 true,否则返回 false

另请参阅:c_let/3

-spec is_c_letrec(Node :: cerl()) -> boolean().

如果 节点 是抽象 letrec 表达式,则返回 true,否则返回 false

另请参阅:c_letrec/2

-spec is_c_list(Node :: cerl()) -> boolean().

如果 节点 表示正确的列表,则返回 true,否则返回 false

正确的列表要么是空列表 [],要么是 cons 单元 [Head | Tail],其中递归地 Tail 是一个正确的列表。

注意:由于 Node 是一个语法树,因此与其子树相对应的实际运行时值通常可能部分或完全未知。因此,如果 Node 例如表示 "[... | Ns]"(其中 Ns 是一个变量),则该函数将返回 false,因为不知道 Ns 在运行时是否会绑定到列表。如果 Node 例如表示 "[1, 2, 3]" 或 "[A | []]",则该函数将返回 true

另请参阅: c_cons/2c_nil/0list_elements/1list_length/1

此函数的链接

is_c_map(节点)

查看源代码 (自 OTP 17.0 起)
-spec is_c_map(Node :: cerl()) -> boolean().

如果 节点 是任何类型的抽象映射(用于构造、更新或匹配),则返回 true,否则返回 false

另请参阅: ann_c_map/3c_map/1c_map_pattern/1

此函数的链接

is_c_map_empty(节点)

查看源代码 (自 OTP 17.0 起)
-spec is_c_map_empty(Node :: c_map() | c_literal()) -> boolean().

如果 节点 表示空抽象映射,则返回 true,否则返回 false

另请参阅: c_map/1, c_map_pattern/1

此函数的链接

is_c_map_pattern(节点)

查看源代码 (自 OTP 17.0 起)
-spec is_c_map_pattern(Node :: c_map()) -> boolean().

如果 节点 是抽象映射模式,则返回 true,否则返回 false

另请参阅: c_map/1, c_map_pattern/1

-spec is_c_module(Node :: cerl()) -> boolean().

如果 节点 是抽象模块定义,则返回 true,否则返回 false

另请参阅: type/1

-spec is_c_nil(Node :: cerl()) -> boolean().

如果 节点 是抽象空列表,则返回 true,否则返回 false

-spec is_c_primop(Node :: cerl()) -> boolean().

如果 节点 是抽象原始操作调用,则返回 true,否则返回 false

另请参阅:c_primop/2

-spec is_c_receive(Node :: cerl()) -> boolean().

如果 节点 是抽象接收表达式,则返回 true,否则返回 false

另请参阅: c_receive/3

-spec is_c_seq(Node :: cerl()) -> boolean().

如果 节点 是抽象排序表达式,则返回 true,否则返回 false

另请参阅:c_seq/2

-spec is_c_string(Node :: cerl()) -> boolean().

如果 节点 可能表示字符串文字,则返回 true,否则返回 false

字符串定义为字符列表;有关详细信息,请参见 is_c_char/1

另请参阅: c_string/1is_c_char/1is_print_string/1

-spec is_c_try(Node :: cerl()) -> boolean().

如果 节点 是抽象 try 表达式,则返回 true,否则返回 false

另请参阅:c_try/5

-spec is_c_tuple(Node :: cerl()) -> boolean().

如果 节点 是抽象元组,则返回 true,否则返回 false

另请参阅:c_tuple/1

-spec is_c_values(Node :: cerl()) -> boolean().

如果 节点 是抽象值列表,则返回 true,否则返回 false

另请参阅:c_values/1

-spec is_c_var(Node :: cerl()) -> boolean().

如果 节点 是抽象变量,则返回 true,否则返回 false

另请参阅:c_var/1

-spec is_data(Node :: cerl()) -> boolean().

如果 节点 表示数据构造器,则返回 true,否则返回 false

数据构造函数是 cons 单元、元组和原子字面量。

另请参阅: data_arity/1data_es/1data_type/1

-spec is_leaf(Node :: cerl()) -> boolean().

如果 节点 是叶节点,则返回 true,否则返回 false

当前的叶节点类型为 literalvar

注意:所有字面量(参见 is_literal/1)都是叶节点,即使它们表示结构化的(常量)值,如 {foo, [bar, baz]}。另请注意,变量是叶节点但不是字面量。

另请参阅: is_literal/1type/1

-spec is_literal(Node :: cerl()) -> boolean().

如果 节点 表示文字项,则返回 true,否则返回 false

当且仅当 concrete(Node) 的值已定义时,此函数才返回 true

注意:这是一个常量时间操作。

另请参阅: abstract/1concrete/1fold_literal/1

-spec is_literal_term(Term :: term()) -> boolean().

如果 可以表示为文字,则返回 true,否则返回 false

此函数花费的时间与 Term 的大小成正比。

另请参阅:abstract/1

-spec is_print_char(Node :: cerl()) -> boolean().

如果 节点 可能表示“可打印”字符,则返回 true,否则返回 false。(参见 is_c_char/1。)

“可打印”字符要么具有给定的图形表示形式,要么具有“命名”转义序列,如 "\n"。目前,仅识别 ISO 8859-1 (Latin-1) 字符值。

另请参阅: c_char/1is_c_char/1

此函数的链接

is_print_string(节点)

查看源代码
-spec is_print_string(Node :: cerl()) -> boolean().

如果 节点 可能表示仅包含“可打印”字符的字符串文字,则返回 true,否则返回 false

有关详细信息,请参见 is_c_string/1is_print_char/1。目前,仅识别 ISO 8859-1 (Latin-1) 字符值。

另请参阅: c_string/1is_c_string/1is_print_char/1

-spec let_arg(Node :: c_let()) -> cerl().

返回抽象 let 表达式的参数子树。

另请参阅:c_let/3

-spec let_arity(Node :: c_let()) -> non_neg_integer().

返回抽象 let 表达式左侧变量的数量。

注意:这等效于 length(let_vars(Node)),但可能更高效。

另请参阅: c_let/3let_vars/1

-spec let_body(Node :: c_let()) -> cerl().

返回抽象 let 表达式的主体子树。

另请参阅:c_let/3

-spec let_vars(Node :: c_let()) -> [cerl()].

返回抽象 let 表达式的左侧变量列表。

另请参阅: c_let/3let_arity/1

-spec letrec_body(Node :: c_letrec()) -> cerl().

返回抽象 letrec 表达式的主体子树。

另请参阅:c_letrec/2

-spec letrec_defs(Node :: c_letrec()) -> [{cerl(), cerl()}].

返回抽象 letrec 表达式的定义列表。

如果 Node 表示“letrec V1 = F1 ... Vn = Fn in Body”,则返回值是 [{V1, F1}, ..., {Vn, Fn}]

另请参阅:c_letrec/2

-spec letrec_vars(Node :: c_letrec()) -> [cerl()].

返回 letrec 表达式左侧函数变量子树的列表。

如果 Node 表示“letrec V1 = F1 ... Vn = Fn in Body”,则返回值是 [V1, ..., Vn]

另请参阅:c_letrec/2

-spec list_elements(Node :: c_cons() | c_literal()) -> [cerl()].

返回抽象列表的元素子树列表。

Node 必须表示一个正确的列表。例如,如果 Node 表示“[X1, X2 | [X3, X4 | []]”,则 list_elements(Node) 会产生列表 [X1, X2, X3, X4]

另请参阅:c_cons/2c_nil/0is_c_list/1list_length/1make_list/2

-spec list_length(Node :: c_cons() | c_literal()) -> non_neg_integer().

返回抽象列表的元素子树的数量。

Node 必须表示一个正确的列表。例如,如果 Node 表示 “[X1 | [X2, X3 | [X4, X5, X6]]]”,则 list_length(Node) 返回整数 6。

注意:这等效于 length(list_elements(Node)),但可能更有效率。

另请参阅:c_cons/2c_nil/0is_c_list/1list_elements/1

此函数的链接

make_data(类型, 元素)

查看源代码
-spec make_data(Type :: dtype(), Elements :: [cerl()]) -> c_lct().

使用指定的类型和子树创建数据构造器节点。(参见 data_type/1。)

如果 Elements 的长度对于给定的 Type 无效,则会抛出异常;有关构造器类型的元数约束,请参阅 data_es/1

另请参阅:ann_make_data/3data_es/1data_type/1make_data_skel/2update_data/3

此函数的链接

make_data_skel(类型, 元素)

查看源代码
-spec make_data_skel(Type :: dtype(), Elements :: [cerl()]) -> c_lct().

类似于 make_data/2,但类似于 c_tuple_skel/1c_cons_skel/2

另请参阅:ann_make_data_skel/3c_cons_skel/2c_tuple_skel/1make_data/2update_data_skel/3

-spec make_list(List :: [cerl()]) -> cerl().

等效于 make_list(List, none)

此函数的链接

make_list(列表, 尾部)

查看源代码
-spec make_list(List :: [cerl()], Tail :: cerl() | none) -> cerl().

列表 中的元素和可选的 尾部 创建抽象列表。

如果 Tailnone,则结果将表示一个以 nil 结尾的列表,否则表示“[... | Tail]”。

另请参阅:ann_make_list/3c_cons/2c_nil/0list_elements/1update_list/3

此函数的链接

make_tree(类型, 组)

查看源代码
-spec make_tree(Type :: ctype(), Groups :: [[cerl()], ...]) -> cerl().

使用给定的类型和子树创建语法树。

Type 必须是节点类型名称(参见 type/1),它不表示叶节点类型(参见 is_leaf/1)。

Groups 必须是语法树组的非空列表,表示给定类型的节点的子树,按照它们在打印的程序文本中出现的从左到右的顺序排列,并按 subtrees/1 所做的那样按类别分组。

ann_make_tree(get_ann(Node), type(Node), subtrees(Node)) 的结果(参见 update_tree/2)表示与原始 Node 相同的源代码文本,假设 subtrees(Node) 产生一个非空列表。但是,它不一定具有与 Node 完全相同的数据表示。

另请参阅:ann_make_tree/3is_leaf/1subtrees/1type/1update_tree/2

此函数的链接

map_arg(节点)

查看源代码 (自 OTP 17.0 起)
-spec map_arg(Node :: c_map() | c_literal()) -> c_map() | c_literal().

返回抽象映射的参数子树。

另请参阅:c_map/2

此函数的链接

map_es(节点)

查看源代码 (自 OTP 17.0 起)
-spec map_es(Node :: c_map() | c_literal()) -> [c_map_pair()].

返回抽象映射的映射对子树列表。

另请参阅:c_map/1

此函数的链接

map_pair_key(节点)

查看源代码 (自 OTP 17.0 起)
-spec map_pair_key(Node :: c_map_pair()) -> cerl().

返回抽象映射对的键子树。

另请参阅:c_map_pair/2c_map_pair_exact/2

此函数的链接

map_pair_op(节点)

查看源代码 (自 OTP 17.0 起)
-spec map_pair_op(Node :: c_map_pair()) -> map_op().

返回抽象映射对的操作子树。

另请参阅:c_map_pair/2c_map_pair_exact/2

此函数的链接

map_pair_val(节点)

查看源代码 (自 OTP 17.0 起)
-spec map_pair_val(Node :: c_map_pair()) -> cerl().

返回抽象映射对的值子树。

另请参阅:c_map_pair/2c_map_pair_exact/2

-spec meta(Tree :: cerl()) -> cerl().

创建语法树的元表示。

结果表示一个 Erlang 表达式 “MetaTree”,如果对其进行求值,将产生一个新的语法树,该语法树表示与 Tree 相同的源代码文本(尽管实际的数据表示可能不同)。由 MetaTree 表示的表达式在抽象语法树实现所使用的数据结构方面是与实现无关的

Tree 中,任何节点类型为 var(参见 type/1)并且其注释列表(参见 get_ann/1)包含原子 meta_var 的节点,在生成的树中将保持不变,只是会从其注释列表中删除一个 meta_var

函数 meta/1 的主要用途是将表示一段程序代码的数据结构 Tree 转换为一种在打印时与表示无关的形式。例如,假设 Tree 表示一个名为 “V” 的变量。然后(假设有一个用于打印语法树的函数 print/1),对 print(abstract(Tree)) 求值(仅使用 abstract/1 将实际的数据结构映射到语法树表示)将输出一个可能类似于 “{var, ..., 'V'}” 的字符串,这显然取决于抽象语法树的实现。例如,这对于在文件中缓存语法树可能很有用。但是,在某些情况下(例如在程序生成器生成器(带有两个“生成器”)中),这可能是不可接受的。使用 print(meta(Tree)) 代替将输出一个与表示无关的语法树生成表达式;在上面的例子中,类似于 “cerl:c_var('V')”。

该实现试图生成关于文字和列表的紧凑代码。

另请参阅:abstract/1get_ann/1type/1

-spec module_attrs(Node :: c_module()) -> [{cerl(), cerl()}].

返回抽象模块定义的属性键/值子树对列表。

另请参阅: c_module/4

-spec module_defs(Node :: c_module()) -> [{cerl(), cerl()}].

返回抽象模块定义的函数定义列表。

另请参阅: c_module/4

此函数的链接

module_exports(节点)

查看源代码
-spec module_exports(Node :: c_module()) -> [cerl()].

返回抽象模块定义的导出子树列表。

另请参阅: c_module/4

-spec module_name(Node :: c_module()) -> cerl().

返回抽象模块定义的名称子树。

另请参阅: c_module/4

-spec module_vars(Node :: c_module()) -> [cerl()].

返回抽象模块定义的左侧函数变量子树列表。

另请参阅: c_module/4

-spec pat_list_vars(Patterns :: [cerl()]) -> [cerl()].

返回给定模式中所有抽象变量的列表。

如果 Patterns 中的某些元素不表示格式良好的 Core Erlang 子句模式,则会抛出异常。列表的顺序未定义。

另请参阅:clause_vars/1pat_vars/1

-spec pat_vars(Node :: cerl()) -> [cerl()].

返回模式中所有抽象变量的列表。

如果 Node 不表示格式良好的 Core Erlang 子句模式,则会抛出异常。列表的顺序未定义。

另请参阅:clause_vars/1pat_list_vars/1

-spec primop_args(Node :: c_primop()) -> [cerl()].

返回抽象原始操作调用的参数子树列表。

另请参阅:c_primop/2primop_arity/1

-spec primop_arity(Node :: c_primop()) -> arity().

返回抽象原始操作调用的参数子树的数量。

注意:这等效于 length(primop_args(Node)),但可能更有效率。

另请参阅:c_primop/2primop_args/1

-spec primop_name(Node :: c_primop()) -> cerl().

返回抽象原始操作调用的名称子树。

另请参阅:c_primop/2

此函数的链接

receive_action(节点)

查看源代码
-spec receive_action(Node :: c_receive()) -> cerl().

返回抽象接收表达式的动作子树。

另请参阅: c_receive/3

此函数的链接

receive_clauses(节点)

查看源代码
-spec receive_clauses(Node :: c_receive()) -> [cerl()].

返回抽象接收表达式的子句子树列表。

另请参阅: c_receive/3

此函数的链接

receive_timeout(节点)

查看源代码
-spec receive_timeout(Node :: c_receive()) -> cerl().

返回抽象接收表达式的超时子树。

另请参阅: c_receive/3

-spec seq_arg(Node :: c_seq()) -> cerl().

返回抽象序列表达式的参数子树。

另请参阅:c_seq/2

-spec seq_body(Node :: c_seq()) -> cerl().

返回抽象序列表达式的主体子树。

另请参阅:c_seq/2

此函数的链接

set_ann(节点, 注释)

查看源代码
-spec set_ann(Node :: cerl(), Annotations :: [term()]) -> cerl().

节点 的用户注释列表设置为 注释

另请参阅:add_ann/2copy_ann/2get_ann/1

-spec string_lit(Node :: c_literal()) -> nonempty_string().

返回由抽象字符串表示的字面字符串。这包括周围的双引号字符 "..."

当前,除了空格之外,不在 ISO 8859-1(Latin-1)“打印”字符集中的字符将被转义。

另请参阅:c_string/1

-spec string_val(Node :: c_literal()) -> string().

返回由抽象字符串字面量表示的值。

另请参阅:c_string/1

-spec subtrees(Node :: cerl()) -> [[cerl()]].

返回节点的所有子树的分组列表。

如果 Node 是一个叶节点(参见 is_leaf/1),则这是空列表,否则结果始终是非空列表,其中包含 Node 的子树列表,按照它们在打印的程序文本中出现的从左到右的顺序排列,并按类别分组。通常,每个组仅包含一个子树。

根据 Node 的类型,某些组的大小可能是可变的(例如,由元组的所有元素组成的组),而另一些组始终包含相同数量的元素 - 通常恰好是一个(例如,包含 case 表达式的参数表达式的组)。但是请注意,通常不应依赖返回列表(对于给定的节点类型)的确切结构,因为它可能会在没有通知的情况下发生更改。

如果要遍历语法树、访问其所有子树,但在大多数或所有情况下以统一的方式处理树的节点,那么函数 subtrees/1 和构造函数 make_tree/2update_tree/2 可以提供很大的帮助。使用这些函数可以简化此操作,并且还可以确保您的代码不会对语法树数据类型的扩展过于敏感,因为您的代码未显式处理的任何节点类型都可以留给默认情况。

例如

    postorder(F, Tree) ->
        F(case subtrees(Tree) of
            [] -> Tree;
            List -> update_tree(Tree,
                                [[postorder(F, Subtree)
                                  || Subtree <- Group]
                                 || Group <- List])
          end).

将函数 F 映射到 Tree 及其所有子树,执行语法树的后序遍历。(请注意使用 update_tree/2 来保留注释。)对于像这样的简单函数

    f(Node) ->
        case type(Node) of
            atom -> atom("a_" ++ atom_name(Node));
            _ -> Node
        end.

调用 postorder(fun f/1, Tree) 将产生 Tree 的新表示形式,其中所有原子名称都已扩展了前缀 “a_”,但其他任何内容(包括注释)均未更改。

另请参阅:is_leaf/1make_tree/2update_tree/2

-spec to_records(Node :: cerl()) -> cerl().

将抽象语法树转换为相应的显式记录表示。

这些记录在文件 “cerl.hrl” 中定义。

另请参阅:from_records/1type/1

-spec try_arg(Node :: c_try()) -> cerl().

返回抽象 try 表达式的表达式子树。

另请参阅:c_try/5

-spec try_body(Node :: c_try()) -> cerl().

返回抽象 try 表达式的成功主体子树。

另请参阅:c_try/5

-spec try_evars(Node :: c_try()) -> [cerl()].

返回抽象 try 表达式的异常变量子树列表。

另请参阅:c_try/5

-spec try_handler(Node :: c_try()) -> cerl().

返回抽象 try 表达式的异常主体子树。

另请参阅:c_try/5

-spec try_vars(Node :: c_try()) -> [cerl()].

返回抽象 try 表达式的成功变量子树列表。

另请参阅:c_try/5

-spec tuple_arity(Node :: c_tuple() | c_literal()) -> non_neg_integer().

返回抽象元组的元素子树的数量。

注意:这等效于 length(tuple_es(Node)),但可能更有效率。

另请参阅:c_tuple/1tuple_es/1

-spec tuple_es(Node :: c_tuple() | c_literal()) -> [cerl()].

返回抽象元组的元素子树列表。

另请参阅:c_tuple/1

-spec type(Node :: cerl()) -> ctype().

返回 节点 的类型标签。

当前的节点类型是

  • alias
  • apply
  • binary
  • bitstr
  • call
  • case
  • catch
  • clause
  • cons
  • fun
  • let
  • letrec
  • literal
  • map
  • map_pair
  • module
  • opaque
  • primop
  • receive
  • seq
  • try
  • tuple
  • values
  • var

注意

节点类型的主要构造器函数的名称始终是类型本身的名称,前缀为 “c_”;识别谓词相应地以 “is_c_” 为前缀。此外,为了简化注释的保留(参见 get_ann/1),还有以 “ann_c_” 和 “update_c_” 为前缀的类似构造器函数,分别用于将新节点的注释列表设置为特定值或设置为现有节点的注释。

opaque 类型的唯一目的是方便编译器的测试。

另请参阅:abstract/1c_alias/2c_apply/2c_binary/1c_bitstr/5c_call/3c_case/2c_catch/1c_clause/3c_cons/2c_fun/2c_let/3c_letrec/2c_module/3c_primop/2c_receive/1c_seq/2c_try/5c_tuple/1c_values/1c_var/1data_type/1from_records/1get_ann/1meta/1subtrees/1to_records/1

此函数的链接

unfold_literal(节点)

查看源代码
-spec unfold_literal(Node :: cerl()) -> cerl().

确保字面量具有完全展开的表示形式。

如果 Node 表示字面元组或列表构造函数,则其元素会被递归重写,并分别使用 c_cons_skel/2c_tuple_skel/1 重建节点;否则,Node 不会被更改。fold_literal/1 可用于恢复到正常的紧凑表示形式。

另请参阅:c_cons/2c_cons_skel/2c_tuple/1c_tuple_skel/1fold_literal/1is_literal/1

此函数的链接

update_c_alias(节点, 变量, 模式)

查看源代码
-spec update_c_alias(Node :: c_alias(), Variable :: cerl(), Pattern :: cerl()) -> c_alias().

另请参阅:c_alias/2

此函数的链接

update_c_apply(节点, 运算符, 参数)

查看源代码
-spec update_c_apply(Node :: c_apply(), Operator :: cerl(), Arguments :: [cerl()]) -> c_apply().

另请参阅:c_apply/2

此函数的链接

update_c_binary(节点, 段)

查看源代码
-spec update_c_binary(Node :: c_binary(), Segments :: [cerl()]) -> c_binary().

另请参阅:c_binary/1

此函数的链接

update_c_bitstr(节点, 值, 大小, 类型, 标志)

查看源代码
-spec update_c_bitstr(Node :: c_bitstr(),
                      Value :: cerl(),
                      Size :: cerl(),
                      Type :: cerl(),
                      Flags :: cerl()) ->
                         c_bitstr().

等效于 update_c_bitstr(节点, 值, 大小, abstract(1), 类型, 标志)

此函数的链接

update_c_bitstr(节点, 值, 大小, 单位, 类型, 标志)

查看源代码
-spec update_c_bitstr(Node :: c_bitstr(),
                      Value :: cerl(),
                      Size :: cerl(),
                      Unit :: cerl(),
                      Type :: cerl(),
                      Flags :: cerl()) ->
                         c_bitstr().

另请参阅: c_bitstr/5, update_c_bitstr/5

此函数的链接

update_c_call(节点, 模块, 名称, 参数)

查看源代码
-spec update_c_call(Node :: cerl(), Module :: cerl(), Name :: cerl(), Arguments :: [cerl()]) -> c_call().

另请参阅:c_call/3

此函数的链接

update_c_case(节点, 参数, 子句)

查看源代码
-spec update_c_case(Node :: c_case(), Argument :: cerl(), Clauses :: [cerl()]) -> c_case().

另请参阅:c_case/2

此函数的链接

update_c_catch(节点, 主体)

查看源代码
-spec update_c_catch(Node :: c_catch(), Body :: cerl()) -> c_catch().

另请参阅:c_catch/1

此函数的链接

update_c_clause(节点, 模式, 保护, 主体)

查看源代码
-spec update_c_clause(Node :: c_clause(), Patterns :: [cerl()], Guard :: cerl(), Body :: cerl()) ->
                         c_clause().

另请参阅: c_clause/3

此函数的链接

update_c_cons(节点, 头, 尾)

查看源代码
-spec update_c_cons(Node :: c_literal() | c_cons(), Head :: cerl(), Tail :: cerl()) ->
                       c_literal() | c_cons().

另请参阅:c_cons/2

此函数的链接

update_c_cons_skel(节点, 头, 尾)

查看源代码
-spec update_c_cons_skel(Node :: c_cons() | c_literal(), Head :: cerl(), Tail :: cerl()) -> c_cons().

另请参阅:c_cons_skel/2

此函数的链接

update_c_fname(节点, 名称)

查看源代码
-spec update_c_fname(Node :: c_var(), Name :: atom()) -> c_var().

类似于 update_c_fname/3,但从 节点 获取元数。

另请参阅:c_fname/2update_c_fname/3

此函数的链接

update_c_fname(节点, 名称, 元数)

查看源代码
-spec update_c_fname(Node :: c_var(), Name :: atom(), Arity :: arity()) -> c_var().

等效于 update_c_var(Old, {Atom, Arity})

另请参阅:c_fname/2update_c_fname/2

此函数的链接

update_c_fun(节点, 变量, 主体)

查看源代码
-spec update_c_fun(Node :: c_fun(), Variables :: [cerl()], Body :: cerl()) -> c_fun().

另请参阅:c_fun/2

此函数的链接

update_c_let(节点, 变量, 参数, 主体)

查看源代码
-spec update_c_let(Node :: c_let(), Variables :: [cerl()], Argument :: cerl(), Body :: cerl()) ->
                      c_let().

另请参阅:c_let/3

此函数的链接

update_c_letrec(节点, 定义, 主体)

查看源代码
-spec update_c_letrec(Node :: c_letrec(), Definitions :: [{cerl(), cerl()}], Body :: cerl()) ->
                         c_letrec().

另请参阅:c_letrec/2

此函数的链接

update_c_map(节点, 映射, 对)

查看源代码 (自 OTP 17.0 起)
-spec update_c_map(Node :: c_map(), Map :: cerl(), Pairs :: [c_map_pair()]) -> c_map() | c_literal().

另请参阅: c_map/1, c_map_pattern/1

此函数的链接

update_c_map_pair(节点, 操作, 键, 值)

查看源代码 (自 OTP 17.0 起)
-spec update_c_map_pair(Node :: c_map_pair(), Operation :: map_op(), Key :: cerl(), Value :: cerl()) ->
                           c_map_pair().

另请参阅:c_map_pair/2c_map_pair_exact/2

此函数的链接

update_c_module(节点, 名称, 导出, 属性, 定义)

查看源代码
-spec update_c_module(Node :: c_module(),
                      Name :: cerl(),
                      Exports :: [cerl()],
                      Attributes :: [{cerl(), cerl()}],
                      Definitions :: [{cerl(), cerl()}]) ->
                         c_module().

另请参阅: c_module/4

此函数的链接

update_c_primop(节点, 名称, 参数)

查看源代码
-spec update_c_primop(Node :: cerl(), Name :: cerl(), Arguments :: [cerl()]) -> c_primop().

另请参阅:c_primop/2

此函数的链接

update_c_receive(节点, 子句, 超时, 动作)

查看源代码
-spec update_c_receive(Node :: c_receive(), Clauses :: [cerl()], Timeout :: cerl(), Action :: cerl()) ->
                          c_receive().

另请参阅: c_receive/3

此函数的链接

update_c_seq(节点, 参数, 主体)

查看源代码
-spec update_c_seq(Node :: c_seq(), Argument :: cerl(), Body :: cerl()) -> c_seq().

另请参阅:c_seq/2

此函数的链接

update_c_try(节点, 参数, 变量, 主体, 异常变量, 处理程序)

查看源代码
-spec update_c_try(Node :: c_try(),
                   Argument :: cerl(),
                   Variables :: [cerl()],
                   Body :: cerl(),
                   ExceptionVars :: [cerl()],
                   Handler :: cerl()) ->
                      c_try().

另请参阅:c_try/5

此函数的链接

update_c_tuple(节点, 元素)

查看源代码
-spec update_c_tuple(Node :: c_tuple() | c_literal(), Elements :: [cerl()]) -> c_tuple() | c_literal().

另请参阅:c_tuple/1

此函数的链接

update_c_tuple_skel(节点, 元素)

查看源代码
-spec update_c_tuple_skel(Node :: c_tuple(), Elements :: [cerl()]) -> c_tuple().

另请参阅:c_tuple_skel/1

此函数的链接

update_c_values(节点, 元素)

查看源代码
-spec update_c_values(Node :: c_values(), Elements :: [cerl()]) -> c_values().

另请参阅:c_values/1

此函数的链接

update_c_var(节点, 名称)

查看源代码
-spec update_c_var(Node :: c_var(), Name :: var_name()) -> c_var().

另请参阅:c_var/1

此函数的链接

update_data(节点, 类型, 元素)

查看源代码
-spec update_data(Node :: cerl(), Type :: dtype(), Elements :: [cerl()]) -> c_lct().

另请参阅:make_data/2

此函数的链接

update_data_skel(节点, 类型, 元素)

查看源代码
-spec update_data_skel(Node :: cerl(), Type :: dtype(), Elements :: [cerl()]) -> c_lct().

另请参阅:make_data_skel/2

此函数的链接

update_list(节点, 列表)

查看源代码
-spec update_list(Node :: cerl(), List :: [cerl()]) -> cerl().

等效于 update_list(Old, List, none)

此函数的链接

update_list(节点, 列表, 尾部)

查看源代码
-spec update_list(Node :: cerl(), List :: [cerl()], Tail :: cerl() | none) -> cerl().

另请参阅: make_list/2, update_list/2

此函数的链接

update_tree(节点, 组)

查看源代码
-spec update_tree(Node :: cerl(), Groups :: [[cerl()], ...]) -> cerl().

使用给定的子树创建语法树,并具有与节点 节点 相同的类型和注释。

这等效于 ann_make_tree(get_ann(Node), type(Node), Groups),但可能更有效。

另请参阅:ann_make_tree/3get_ann/1type/1update_tree/3

此函数的链接

update_tree(节点, 类型, 组)

查看源代码
-spec update_tree(Node :: cerl(), Type :: ctype(), Groups :: [[cerl()], ...]) -> cerl().

使用给定的类型和子树创建语法树,并具有与节点 节点 相同的注释。

这等效于 ann_make_tree(get_ann(Node), Type, Groups),但可能更有效。

另请参阅:ann_make_tree/3get_ann/1update_tree/2

-spec values_arity(Node :: c_values()) -> non_neg_integer().

返回抽象值列表的元素子树的数量。

注意:这等效于 length(values_es(Node)),但可能更有效。

另请参阅:c_values/1values_es/1

-spec values_es(Node :: c_values()) -> [cerl()].

返回抽象值列表的元素子树列表。

另请参阅:c_values/1values_arity/1

-spec var_name(Node :: c_var()) -> var_name().

返回抽象变量的名称。

另请参阅:c_var/1