檢視原始碼 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 表達式。

建立抽象映射建構子。

建立抽象映射更新表達式。

使用 assoc 運算子建立抽象映射對。

使用 exact 運算子建立抽象映射對。

建立抽象映射模式。

建立抽象空列表。

建立抽象原始運算呼叫。

建立抽象 receive 表達式。

建立抽象序列表達式。

建立一個抽象的字串文字。

建立一個抽象的 try 表達式。

建立一個抽象的元組。

建立一個抽象的元組骨架。

建立一個抽象的值列表。

建立一個抽象的變數。

傳回一個抽象的跨模組呼叫的引數子樹列表。

傳回一個抽象的跨模組呼叫的引數子樹數量。

傳回一個抽象的跨模組呼叫的模組子樹。

傳回一個抽象的跨模組呼叫的名稱子樹。

傳回一個抽象的 case 表達式的引數子樹。

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

傳回一個抽象的 case 表達式的子句子樹列表。

傳回一個抽象的 catch 表達式的主體子樹。

傳回一個抽象字元所代表的文字字串。這包含一個開頭的 $ 字元。

傳回一個抽象的字元文字所代表的值。

傳回一個抽象的子句的模式子樹數量。

傳回一個抽象的子句的主體子樹。

傳回一個抽象的子句的守衛子樹。

傳回一個抽象的子句的模式子樹列表。

傳回一個抽象的子句的模式中所有抽象變數的列表。

傳回一個語法樹所代表的 Erlang 項。

傳回一個抽象的列表建構子的頭部子樹。

傳回一個抽象的列表建構子的尾部子樹。

將使用者註釋列表從 Source 複製到 Target

傳回一個資料建構子節點的子樹數量。

傳回一個資料建構子節點的子樹列表。

傳回一個資料建構子節點的類型描述符。(參見 is_data/1。)

傳回一個浮點數文字節點所代表的數字字串。

傳回一個浮點數文字節點所代表的值。

傳回一個抽象的函數名稱變數的 arity 部分。

傳回一個抽象的函數名稱變數的識別符部分。

確保文字具有緊湊的表示形式。

將一個明確的記錄表示法轉換為對應的抽象語法樹。

傳回一個抽象的 fun 表達式的參數子樹數量。

傳回一個抽象的 fun 表達式的主體子樹。

傳回一個抽象的 fun 表達式的參數子樹列表。

傳回與一個語法樹節點相關聯的使用者註釋列表。

傳回一個整數文字節點所代表的數字字串。

傳回一個整數文字節點所代表的值。

如果 Node 是一個抽象的模式別名,則傳回 true,否則傳回 false

如果 Node 是一個抽象的函數應用,則傳回 true,否則傳回 false

如果 Node 代表一個原子文字,則傳回 true,否則傳回 false

如果 Node 是一個抽象的二進制範本,則傳回 true,否則傳回 false

如果 Node 是一個抽象的位元字串範本,則傳回 true,否則傳回 false

如果 Node 是一個抽象的跨模組呼叫表達式,則傳回 true,否則傳回 false

如果 Node 是一個抽象的 case 表達式,則傳回 true,否則傳回 false

如果 Node 是一個抽象的 catch 表達式,則傳回 true,否則傳回 false

如果 Node 可能代表一個字元文字,則傳回 true,否則傳回 false

如果 Node 是一個抽象的子句,則傳回 true,否則傳回 false

如果 Node 是一個抽象的列表建構子,則傳回 true,否則傳回 false

如果 Node 代表一個浮點數文字,則傳回 true,否則傳回 false

如果 Node 是一個抽象的函數名稱變數,則傳回 true,否則傳回 false

如果 Node 是一個抽象的 fun 表達式,則傳回 true,否則傳回 false

如果 Node 代表一個整數文字,則傳回 true,否則傳回 false

如果 Node 是一個抽象的 let 表達式,則傳回 true,否則傳回 false

如果 Node 是一個抽象的 letrec 表達式,則傳回 true,否則傳回 false

如果 Node 代表一個正確的列表,則傳回 true,否則傳回 false

如果 Node 是任何種類的抽象映射(用於建構、更新或匹配),則傳回 true,否則傳回 false

如果 Node 代表一個空的抽象映射,則傳回 true,否則傳回 false

如果 Node 是一個抽象的映射模式,則傳回 true,否則傳回 false

如果 Node 是一個抽象的模組定義,則傳回 true,否則傳回 false

如果 Node 是一個抽象的空列表,則傳回 true,否則傳回 false

如果 Node 是一個抽象的原始操作呼叫,則傳回 true,否則傳回 false

如果 Node 是一個抽象的 receive 表達式,則傳回 true,否則傳回 false

如果 Node 是一個抽象的序列表達式,則傳回 true,否則傳回 false

如果 Node 可能代表一個字串文字,則傳回 true,否則傳回 false

如果 Node 是一個抽象的 try 表達式,則傳回 true,否則傳回 false

如果 Node 是一個抽象的元組,則傳回 true,否則傳回 false

如果 Node 是一個抽象的值列表,則傳回 true,否則傳回 false

如果 Node 是一個抽象的變數,則傳回 true,否則傳回 false

如果 Node 代表一個資料建構子,則傳回 true,否則傳回 false

如果 Node 是一個葉節點,則傳回 true,否則傳回 false

如果 Node 代表一個文字項,則傳回 true,否則傳回 false

如果 Term 可以表示為一個文字,則傳回 true,否則傳回 false

如果 Node 可能代表一個「可列印」字元,則傳回 true,否則傳回 false。(參見 is_c_char/1。)

如果 Node 可能代表一個只包含「可列印」字元的字串文字,則傳回 true,否則傳回 false

傳回一個抽象的 let 表達式的引數子樹。

傳回一個抽象的 let 表達式的左側變數數量。

傳回一個抽象的 let 表達式的主體子樹。

傳回一個抽象的 let 表達式的左側變數列表。

傳回一個抽象的 letrec 表達式的主體子樹。

傳回一個抽象的 letrec 表達式的定義列表。

傳回一個抽象的 letrec 表達式的左側函數變數子樹列表。

傳回一個抽象列表的元素子樹列表。

傳回一個抽象列表的元素子樹數量。

建立一個具有指定類型和子樹的資料建構子節點。(參見 data_type/1。)

List 中的元素和可選的 Tail 建立一個抽象列表。

建立一個具有指定類型和子樹的語法樹。

傳回一個抽象映射的引數子樹。

傳回一個抽象映射的映射對子樹列表。

傳回一個抽象映射對的鍵子樹。

傳回一個抽象映射對的操作子樹。

傳回一個抽象映射對的值子樹。

建立一個語法樹的元表示法。

傳回一個抽象的模組定義的屬性鍵/值子樹對列表。

傳回一個抽象的模組定義的函數定義列表。

傳回一個抽象的模組定義的匯出子樹列表。

傳回一個抽象的模組定義的名稱子樹。

傳回一個抽象的模組定義的左側函數變數子樹列表。

傳回給定模式中所有抽象變數的列表。

傳回一個模式中所有抽象變數的列表。

傳回抽象基本運算呼叫的引數子樹列表。

傳回抽象基本運算呼叫的引數子樹數量。

傳回抽象基本運算呼叫的名稱子樹。

傳回抽象接收表達式的動作子樹。

傳回抽象接收表達式的子句子樹列表。

傳回抽象接收表達式的逾時子樹。

傳回抽象循序表達式的引數子樹。

傳回抽象循序表達式的主體子樹。

節點 的使用者註解列表設定為 註解

傳回由抽象字串表示的字串文字。這包含周圍的雙引號字元 "..."

傳回由抽象字串文字表示的值。

傳回節點的所有子樹分組列表。

將抽象語法樹轉換為對應的明確記錄表示法。

傳回抽象 try 表達式的表達式子樹。

傳回抽象 try 表達式的成功主體子樹。

傳回抽象 try 表達式的例外變數子樹列表。

傳回抽象 try 表達式的例外主體子樹。

傳回抽象 try 表達式的成功變數子樹列表。

傳回抽象元組的元素子樹數量。

傳回抽象元組的元素子樹列表。

傳回 節點 的類型標籤。

確保文字具有完整展開的表示法。

類似 update_c_fname/3,但從 節點 取得元數。

使用給定的子樹建立語法樹,並具有與節點 節點 相同的類型和註解。

使用給定的類型和子樹建立語法樹,並具有與節點 節點 相同的註解。

傳回抽象值列表的元素子樹數量。

傳回抽象值列表的元素子樹列表。

傳回抽象變數的名稱。

類型

-type c_alias() :: #c_alias{anno :: list(), var :: cerl:cerl(), pat :: cerl:cerl()}.
-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()]}.
-type c_case() :: #c_case{anno :: list(), arg :: cerl:cerl(), clauses :: [cerl:cerl()]}.
-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()}.
-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()}]}.
-type c_opaque() :: #c_opaque{anno :: list(), val :: any()}.
-type c_primop() :: #c_primop{anno :: list(), name :: cerl:cerl(), args :: [cerl:cerl()]}.
-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()}.
-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/2concrete/1is_literal/1is_literal_term/1

此函式的連結

add_ann(Annotations, Node)

檢視原始碼
-spec add_ann(Annotations :: [term()], Node :: cerl()) -> cerl().

Annotations 附加到 Node 的使用者註解列表。

注意:這等同於 set_ann(節點, 註解 ++ get_ann(節點)),但可能更有效率。

另請參閱:get_ann/1set_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/1c_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/1c_apply/2

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

傳回抽象函數應用程式的引數子樹數量。

注意:這等同於 length(apply_args(節點)),但可能更有效率。

另請參閱:apply_args/1c_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/1c_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().

建立抽象模式別名。

結果表示 "變數 = 模式"。

另請參閱: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().

建立抽象原子文字。

原子 (atom) 的列印名稱是由 Name 表示的字元序列。

注意:將字串作為引數傳遞給此函式會為內部表示建立對應的原子 (atom)。

另請參閱: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 必須表示常數原子 (atom) ('integer''float''binary''utf8''utf16''utf32' 其中之一),而 Flags 必須表示常數列表 "[F1, ..., Fn]",其中所有 Fi 都是原子 (atom)。

另請參閱: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().

建立抽象映射建構子。

如果 Pairs[E1, ..., EN],則結果表示「~{E1, ..., EN}~」(建立新的 map)。請注意,如果 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().

建立抽象映射更新表達式。

如果 Pairs[E1, ..., EN],則結果表示「~{E1, ..., EN | Argument}~」(更新現有的 map)。請注意,如果 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 更新運算式或抽象 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().

建立抽象映射模式。

如果 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

此函式的連結

c_tuple_skel(Elements)

檢視原始碼
-spec c_tuple_skel(Elements :: [cerl()]) -> c_tuple().

建立一個抽象的元組骨架。

不會折疊常數字面值,也就是說,如果 Elements[E1, ..., En],則結果永遠具有 tuple 類型,表示「{E1, ..., En}」。

當需要對 tuple 節點的子節點進行註解時,即使所有子節點都是常數字面值,此函式有時也很有用。但是,請注意,如果將此函式的結果傳遞給 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

此函式的連結

copy_ann(Source, Target)

檢視原始碼
-spec copy_ann(Source :: cerl(), Target :: cerl()) -> cerl().

將使用者註釋列表從 Source 複製到 Target

注意:這等效於 set_ann(Target, get_ann(Source)),但可能更有效率。

另請參閱:get_ann/1set_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().

傳回一個抽象的函數名稱變數的 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().

如果 Node 是一個抽象的模式別名,則傳回 true,否則傳回 false

另請參閱:c_alias/2

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

如果 Node 是一個抽象的函數應用,則傳回 true,否則傳回 false

另請參閱:c_apply/2

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

如果 Node 代表一個原子文字,則傳回 true,否則傳回 false

另請參閱:c_atom/1

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

如果 Node 是一個抽象的二進制範本,則傳回 true,否則傳回 false

另請參閱:c_binary/1

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

如果 Node 是一個抽象的位元字串範本,則傳回 true,否則傳回 false

另請參閱:c_bitstr/5

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

如果 Node 是一個抽象的跨模組呼叫表達式,則傳回 true,否則傳回 false

另請參閱:c_call/3

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

如果 Node 是一個抽象的 case 表達式,則傳回 true,否則傳回 false

另請參閱:c_case/2

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

如果 Node 是一個抽象的 catch 表達式,則傳回 true,否則傳回 false

另請參閱:c_catch/1

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

如果 Node 可能代表一個字元文字,則傳回 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().

如果 Node 是一個抽象的子句,則傳回 true,否則傳回 false

另請參閱:c_clause/3

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

如果 Node 是一個抽象的列表建構子,則傳回 true,否則傳回 false

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

如果 Node 代表一個浮點數文字,則傳回 true,否則傳回 false

另請參閱:c_float/1

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

如果 Node 是一個抽象的函數名稱變數,則傳回 true,否則傳回 false

另請參閱:c_fname/2c_var/1var_name/1

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

如果 Node 是一個抽象的 fun 表達式,則傳回 true,否則傳回 false

另請參閱:c_fun/2

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

如果 Node 代表一個整數文字,則傳回 true,否則傳回 false

另請參閱:c_int/1

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

如果 Node 是一個抽象的 let 表達式,則傳回 true,否則傳回 false

另請參閱:c_let/3

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

如果 Node 是一個抽象的 letrec 表達式,則傳回 true,否則傳回 false

另請參閱:c_letrec/2

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

如果 Node 代表一個正確的列表,則傳回 true,否則傳回 false

正確的清單不是空清單 [],就是 cons cell [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(Node)

檢視原始碼 (自 OTP 17.0 起)
-spec is_c_map(Node :: cerl()) -> boolean().

如果 Node 是任何種類的抽象映射(用於建構、更新或匹配),則傳回 true,否則傳回 false

另請參閱:ann_c_map/3c_map/1c_map_pattern/1

此函式的連結

is_c_map_empty(Node)

檢視原始碼 (自 OTP 17.0 起)
-spec is_c_map_empty(Node :: c_map() | c_literal()) -> boolean().

如果 Node 代表一個空的抽象映射,則傳回 true,否則傳回 false

另請參閱:c_map/1c_map_pattern/1

此函式的連結

is_c_map_pattern(Node)

檢視原始碼 (自 OTP 17.0 起)
-spec is_c_map_pattern(Node :: c_map()) -> boolean().

如果 Node 是一個抽象的映射模式,則傳回 true,否則傳回 false

另請參閱:c_map/1c_map_pattern/1

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

如果 Node 是一個抽象的模組定義,則傳回 true,否則傳回 false

另請參閱:type/1

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

如果 Node 是一個抽象的空列表,則傳回 true,否則傳回 false

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

如果 Node 是一個抽象的原始操作呼叫,則傳回 true,否則傳回 false

另請參閱:c_primop/2

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

如果 Node 是一個抽象的 receive 表達式,則傳回 true,否則傳回 false

另請參閱:c_receive/3

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

如果 Node 是一個抽象的序列表達式,則傳回 true,否則傳回 false

另請參閱:c_seq/2

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

如果 Node 可能代表一個字串文字,則傳回 true,否則傳回 false

字串定義為字元清單;有關詳細資訊,請參閱 is_c_char/1

另請參閱:c_string/1is_c_char/1is_print_string/1

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

如果 Node 是一個抽象的 try 表達式,則傳回 true,否則傳回 false

另請參閱:c_try/5

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

如果 Node 是一個抽象的元組,則傳回 true,否則傳回 false

另請參閱:c_tuple/1

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

如果 Node 是一個抽象的值列表,則傳回 true,否則傳回 false

另請參閱:c_values/1

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

如果 Node 是一個抽象的變數,則傳回 true,否則傳回 false

另請參閱:c_var/1

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

如果 Node 代表一個資料建構子,則傳回 true,否則傳回 false

資料建構子是 cons cell、元組和原子文字。

另請參閱:data_arity/1data_es/1data_type/1

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

如果 Node 是一個葉節點,則傳回 true,否則傳回 false

目前的葉節點類型為 literalvar

注意:所有文字(參閱 is_literal/1)都是葉節點,即使它們代表結構化(常數)值(例如 {foo, [bar, baz]})。另請注意,變數是葉節點,但不是文字。

另請參閱:is_literal/1type/1

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

如果 Node 代表一個文字項,則傳回 true,否則傳回 false

當且僅當 concrete(Node) 的值已定義時,此函式才會傳回 true

注意:這是一個恆定時間操作。

另請參閱:abstract/1concrete/1fold_literal/1

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

如果 Term 可以表示為一個文字,則傳回 true,否則傳回 false

此函式所需的時間與 Term 的大小成正比。

另請參閱:abstract/1

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

如果 Node 可能代表一個「可列印」字元,則傳回 true,否則傳回 false。(參見 is_c_char/1。)

「可列印」字元具有給定的圖形表示法,或「命名」的逸出序列(例如「\n」)。目前,僅識別 ISO 8859-1 (Latin-1) 字元值。

另請參閱:c_char/1is_c_char/1

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

如果 Node 可能代表一個只包含「可列印」字元的字串文字,則傳回 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(Type, Elements)

檢視原始碼
-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(Type, Elements)

檢視原始碼
-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)

-spec make_list(List :: [cerl()], Tail :: cerl() | none) -> cerl().

List 中的元素和可選的 Tail 建立一個抽象列表。

如果 Tailnone,則結果將表示一個以 nil 結尾的列表,否則它表示 "[... | Tail]"。

另請參閱:ann_make_list/3c_cons/2c_nil/0list_elements/1update_list/3

此函式的連結

make_tree(Type, Groups)

檢視原始碼
-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(Node)

檢視原始碼 (自 OTP 17.0 起)
-spec map_arg(Node :: c_map() | c_literal()) -> c_map() | c_literal().

傳回一個抽象映射的引數子樹。

另請參閱:c_map/2

此函式的連結

map_es(Node)

檢視原始碼 (自 OTP 17.0 起)
-spec map_es(Node :: c_map() | c_literal()) -> [c_map_pair()].

傳回一個抽象映射的映射對子樹列表。

另請參閱:c_map/1

此函式的連結

map_pair_key(Node)

檢視原始碼 (自 OTP 17.0 起)
-spec map_pair_key(Node :: c_map_pair()) -> cerl().

傳回一個抽象映射對的鍵子樹。

另請參閱:c_map_pair/2c_map_pair_exact/2

此函式的連結

map_pair_op(Node)

檢視原始碼 (自 OTP 17.0 起)
-spec map_pair_op(Node :: c_map_pair()) -> map_op().

傳回一個抽象映射對的操作子樹。

另請參閱:c_map_pair/2c_map_pair_exact/2

此函式的連結

map_pair_val(Node)

檢視原始碼 (自 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

-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

此函式的連結

pat_list_vars(Patterns)

檢視原始碼
-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/5update_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(舊, {原子, 元數})

另請參閱: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/1c_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(舊, 列表, 無)

此函式的連結

update_list(節點, 列表, 尾部)

檢視原始碼
-spec update_list(Node :: cerl(), List :: [cerl()], Tail :: cerl() | none) -> cerl().

另請參閱:make_list/2update_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