檢視原始碼 cerl (編譯器 v8.5.4)
Core Erlang 抽象語法樹。
注意
Erlang 編譯器的公開介面可以在模組
compile
中找到。這個模組是編譯器的內部部分。其 API 無法保證在不同版本之間保持相容性。
這個模組定義了一個抽象資料型別,用於將 Core Erlang 原始碼表示為語法樹。
對於初次使用者,建議從函數 type/1
的文件開始。
注意
這個模組處理語法實體(與語義實體相對)的組成和分解;其目的是隱藏所有對用於表示這些實體的資料結構的直接引用。除了少數例外,這個模組中的函數不對其輸入執行語義解釋,一般假設使用者傳遞型別正確的引數 - 如果沒有這樣做,則效果未定義。
目前,使用的內部資料結構與 Beam 編譯器傳統上使用的基於記錄的資料結構相同。
抽象語法樹的內部表示可能會在不另行通知的情況下更改,並且不應在這個模組之外記錄。此外,我們不保證抽象語法樹可能或不可能如何表示,但有以下例外:沒有語法樹由單個原子表示,例如
none
,由列表建構子[X | Y]
或空列表[]
表示。在編寫操作語法樹的函數時,可以依賴這一點。
摘要
函數
建立與 Erlang 術語對應的語法樹。
將 Annotations
附加到 Node
的使用者註解列表。
傳回抽象模式別名的模式子樹。
傳回抽象模式別名的變數子樹。
另請參閱:c_map_pattern/2
建立具有給定註解、型別和子樹的語法樹。
傳回抽象函數應用程式的引數子樹列表。
傳回抽象函數應用程式的引數子樹數量。
傳回抽象函數應用程式的運算子子樹。
傳回由抽象原子表示的文字字串。這始終包含周圍的單引號字元。
傳回抽象原子的列印名稱。
傳回由抽象原子表示的值。
傳回抽象二進位範本的區段子樹列表。
傳回抽象位元字串範本的總位元大小。
傳回抽象位元字串範本的旗標子樹。
傳回抽象位元字串範本的大小子樹。
傳回抽象位元字串範本的型別子樹。
傳回抽象位元字串範本的單位子樹。
傳回抽象位元字串範本的值子樹。
建立抽象模式別名。
建立抽象函數應用程式。
建立抽象原子文字。
建立抽象二進位範本。
建立抽象位元字串範本。
建立抽象跨模組呼叫。
建立抽象 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
,但從 節點
取得元數。
另請參閱:c_var/1
。
使用給定的子樹建立語法樹,並具有與節點 節點
相同的類型和註解。
使用給定的類型和子樹建立語法樹,並具有與節點 節點
相同的註解。
傳回抽象值列表的元素子樹數量。
傳回抽象值列表的元素子樹列表。
傳回抽象變數的名稱。
類型
-type c_binary() :: #c_binary{anno :: list(), segments :: [cerl:c_bitstr()]}.
-type c_map() :: #c_map{anno :: list(), arg :: cerl:c_var() | cerl:c_literal(), es :: [cerl:c_map_pair()], is_pat :: boolean()}.
-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()}.
函式
建立與 Erlang 術語對應的語法樹。
Term
必須是文字項,也就是可以表示為原始碼文字的項。因此,它可能不包含程序識別符、埠、參考、二進位或函式值作為子項。
注意:這是一個恆定時間操作。
另請參閱:ann_abstract/2
、concrete/1
、is_literal/1
、is_literal_term/1
。
將 Annotations
附加到 Node
的使用者註解列表。
注意:這等同於 set_ann(節點, 註解 ++ get_ann(節點))
,但可能更有效率。
傳回抽象模式別名的模式子樹。
另請參閱:c_alias/2
。
傳回抽象模式別名的變數子樹。
另請參閱:c_alias/2
。
另請參閱:abstract/1
。
另請參閱:c_alias/2
。
另請參閱:c_apply/2
。
另請參閱:c_atom/1
。
另請參閱:c_binary/1
。
-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)。
-spec ann_c_bitstr(Annotations :: [term()], Value :: cerl(), Size :: cerl(), Unit :: cerl(), Type :: cerl(), Flags :: cerl()) -> c_bitstr().
另請參閱:ann_c_bitstr/5
、c_bitstr/5
。
-spec ann_c_call(Annotations :: [term()], Module :: cerl(), Name :: cerl(), Arguments :: [cerl()]) -> c_call().
另請參閱:c_call/3
。
另請參閱:c_case/2
。
另請參閱:c_catch/1
。
另請參閱:c_char/1
。
等同於 ann_c_clause(As, Patterns, c_atom(true), Body)。
另請參閱:c_clause/3
。
-spec ann_c_clause(Annotations :: [term()], Patterns :: [cerl()], Guard :: cerl(), Body :: cerl()) -> c_clause().
另請參閱:ann_c_clause/3
、c_clause/3
。
-spec ann_c_cons(Annotations :: [term()], Head :: cerl(), Tail :: cerl()) -> c_literal() | c_cons().
另請參閱:c_cons/2
。
另請參閱:c_cons_skel/2
。
另請參閱:c_float/1
。
等同於 ann_c_var(As, {Atom, Arity})。
另請參閱:c_fname/2
。
另請參閱:c_fun/2
。
另請參閱:c_int/1
。
-spec ann_c_let(Annotations :: [term()], Variables :: [cerl()], Argument :: cerl(), Body :: cerl()) -> c_let().
另請參閱:c_let/3
。
-spec ann_c_letrec(Annotations :: [term()], Definitions :: [{cerl(), cerl()}], Body :: cerl()) -> c_letrec().
另請參閱:c_letrec/2
。
-spec ann_c_map(Annotations :: [term()], Pairs :: [c_map_pair()]) -> c_map() | c_literal().
另請參閱:c_map/1
。
-spec ann_c_map(Annotations :: [term()], Argument :: c_map() | c_literal(), Pairs :: [c_map_pair()]) -> c_map() | c_literal().
另請參閱:c_map/2
-spec ann_c_map_pair(Annotations :: [term()], Operation :: cerl(), Key :: cerl(), Value :: cerl()) -> c_map_pair().
-spec ann_c_map_pattern(Annotations :: [term()], Pairs :: [c_map_pair()]) -> c_map().
另請參閱:c_map_pattern/2
-spec ann_c_module(Annotations :: [term()], Name :: cerl(), Exports :: [cerl()], Definitions :: [{cerl(), cerl()}]) -> c_module().
另請參閱:ann_c_module/5
、c_module/3
。
-spec ann_c_module(Annotations :: [term()], Name :: cerl(), Exports :: [cerl()], Attributes :: [{cerl(), cerl()}], Definitions :: [{cerl(), cerl()}]) -> c_module().
另請參閱:ann_c_module/4
、c_module/4
。
另請參閱:c_nil/0
。
另請參閱:c_primop/2
。
等同於 ann_c_receive(As, Clauses, c_atom(infinity), c_atom(true))。
另請參閱:c_atom/1
、c_receive/3
。
-spec ann_c_receive(Annotations :: [term()], Clauses :: [cerl()], Timeout :: cerl(), Actions :: cerl()) -> c_receive().
另請參閱:ann_c_receive/2
、c_receive/3
。
另請參閱:c_seq/2
。
另請參閱:c_string/1
。
-spec ann_c_try(Annotations :: [term()], Argument :: cerl(), Variables :: [cerl()], Body :: cerl(), ExceptionVars :: [cerl()], Handler :: cerl()) -> c_try().
另請參閱:c_try/5
。
另請參閱:c_tuple/1
。
另請參閱:c_tuple_skel/1
。
另請參閱:c_values/1
。
另請參閱:c_var/1
。
另請參閱:make_data/2
。
-spec ann_make_data_skel(Annotations :: [term()], Type :: dtype(), Elements :: [cerl()]) -> c_lct().
另請參閱:make_data_skel/2
。
另請參閱:ann_make_list/2
、make_list/2
。
建立具有給定註解、型別和子樹的語法樹。
請參閱 make_tree/2
以了解詳細資訊。
另請參閱:make_tree/2
。
傳回抽象函數應用程式的引數子樹列表。
另請參閱:apply_arity/1
、c_apply/2
。
傳回抽象函數應用程式的引數子樹數量。
注意:這等同於 length(apply_args(節點))
,但可能更有效率。
另請參閱:apply_args/1
、c_apply/2
。
傳回抽象函數應用程式的運算子子樹。
另請參閱:c_apply/2
。
-spec atom_lit(Node :: cerl()) -> nonempty_string().
傳回由抽象原子表示的文字字串。這始終包含周圍的單引號字元。
請注意,抽象原子可能有多種文字表示法,且此函式產生的表示法不是固定的;例如,atom_lit(c_atom("a\012b"))
可能會產生字串 "\'a\\nb\'"
。
另請參閱:c_atom/1
。
傳回抽象原子的列印名稱。
另請參閱:c_atom/1
。
傳回由抽象原子表示的值。
另請參閱:c_atom/1
。
傳回抽象二進位範本的區段子樹列表。
另請參閱:c_binary/1
、c_bitstr/5
。
-spec bitstr_bitsize(Node :: c_bitstr()) -> all | any | utf | non_neg_integer().
傳回抽象位元字串範本的總位元大小。
如果大小欄位是整數文字,則結果是大小和單位值的乘積;如果大小欄位是原子文字 all
,則會傳回原子 all
。如果大小不是文字,則會傳回原子 any
。如果位元字串段的類型是 utf8
、utf16
或 utf32
其中之一,則會傳回原子 utf
。
另請參閱:c_bitstr/5
。
傳回抽象位元字串範本的旗標子樹。
另請參閱:c_bitstr/5
。
傳回抽象位元字串範本的大小子樹。
另請參閱:c_bitstr/5
。
傳回抽象位元字串範本的型別子樹。
另請參閱:c_bitstr/5
。
傳回抽象位元字串範本的單位子樹。
另請參閱:c_bitstr/5
。
傳回抽象位元字串範本的值子樹。
另請參閱:c_bitstr/5
。
建立抽象模式別名。
結果表示 "變數 = 模式
"。
另請參閱:alias_pat/1
、alias_var/1
、ann_c_alias/3
、c_clause/3
、is_c_alias/1
、update_c_alias/3
。
建立抽象函數應用程式。
如果 Arguments
是 [A1, ..., An]
,則結果表示 "apply Operator(A1, ..., An)
"。
另請參閱:ann_c_apply/3
、apply_args/1
、apply_arity/1
、apply_op/1
、c_call/3
、c_primop/2
、is_c_apply/1
、update_c_apply/3
。
建立抽象原子文字。
原子 (atom) 的列印名稱是由 Name
表示的字元序列。
注意:將字串作為引數傳遞給此函式會為內部表示建立對應的原子 (atom)。
另請參閱:ann_c_atom/2
、atom_lit/1
、atom_name/1
、atom_val/1
、is_c_atom/1
。
建立抽象二進位範本。
在此上下文中,二進位物件是任意數量的位元序列。(過去使用的位元數可被 8 整除,但在 Erlang 語言中引入位元字串後,決定將二進位範本用於所有位元字串。)它由零個或多個任意長度(以位元數計)的位元字串範本區段指定。
如果 Segments
是 [S1, ..., Sn]
,則結果表示 "#{S1, ..., Sn}#
"。所有 Si
都必須具有 bitstr
類型。
另請參閱:ann_c_binary/2
、binary_segments/1
、c_bitstr/5
、is_c_binary/1
、update_c_binary/2
。
等同於 c_bitstr(Value, abstract(all), abstract(1), 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/6
、bitstr_flags/1
、bitstr_size/1
、bitstr_type/1
、bitstr_unit/1
、bitstr_val/1
、c_binary/1
、is_c_bitstr/1
、update_c_bitstr/6
。
建立抽象跨模組呼叫。
如果 Arguments
是 [A1, ..., An]
,則結果表示 "call Module:Name(A1, ..., An)
"。
另請參閱:ann_c_call/4
、c_apply/2
、c_primop/2
、call_args/1
、call_arity/1
、call_module/1
、call_name/1
、is_c_call/1
、update_c_call/4
。
建立抽象 case 表達式。
如果 Clauses
是 [C1, ..., Cn]
,則結果表示 "case Argument of C1 ... Cn end
"。 Clauses
不得為空。
另請參閱:ann_c_case/3
、c_clause/3
、case_arg/1
、case_arity/1
、case_clauses/1
、is_c_case/1
、update_c_case/3
。
建立抽象 catch 表達式。
結果表示 "catch Body
"。
注意:catch 表達式可以重寫為 try 表達式,最終將從 Core Erlang 中移除。
另請參閱:ann_c_catch/2
、c_try/5
、catch_body/1
、is_c_catch/1
、update_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/2
、c_int/1
、c_string/1
、char_lit/1
、char_val/1
、is_c_char/1
、is_print_char/1
。
等同於 c_clause(Patterns, c_atom(true), Body)。
另請參閱:c_atom/1
。
建立抽象子句。
如果 Patterns
是 [P1, ..., Pn]
,則結果表示 "<P1, ..., Pn> when Guard -> Body
"。
另請參閱:ann_c_clause/4
、c_case/2
、c_clause/2
、c_receive/3
、clause_arity/1
、clause_body/1
、clause_guard/1
、clause_pats/1
、clause_vars/1
、is_c_clause/1
、update_c_clause/4
。
建立抽象列表建構子。
結果表示 "[Head | Tail]
"。請注意,如果 Head
和 Tail
都具有 literal
類型,則結果也將具有 literal
類型,並且 Head
和 Tail
的註釋將遺失。
回想一下,在 Erlang 中,列表建構子的尾部元素不一定是列表。
另請參閱:ann_c_cons/3
、c_cons_skel/2
、c_nil/0
、cons_hd/1
、cons_tl/1
、is_c_cons/1
、is_c_list/1
、list_elements/1
、list_length/1
、make_list/2
、update_c_cons/3
。
建立抽象列表建構子骨架。
不會摺疊常數文字,也就是說,結果始終具有 cons
類型,表示 "[Head | Tail]
"。
當需要對列表建構子節點的子節點進行註釋時,即使子節點是常數文字,此函式偶爾也很有用。但是,請注意,如果傳遞此函式的結果,則 is_literal/1
將產生 false
,而 concrete/1
將失敗。
fold_literal/1
可用於將節點還原為標準形式的表示。
另請參閱:ann_c_cons_skel/3
、c_cons/2
、c_nil/0
、concrete/1
、fold_literal/1
、is_c_cons/1
、is_c_list/1
、is_literal/1
、update_c_cons_skel/3
。
建立抽象浮點文字。
詞彙表示法是 Value
的十進位浮點數。
等同於 c_var({Name, Arity})。
另請參閱:ann_c_fname/3
、fname_arity/1
、fname_id/1
、is_c_fname/1
、update_c_fname/3
。
建立抽象 fun 表達式。
如果 Variables
是 [V1, ..., Vn]
,則結果表示 "fun (V1, ..., Vn) -> Body
"。所有 Vi
都必須具有 var
類型。
另請參閱:ann_c_fun/3
、fun_arity/1
、fun_body/1
、fun_vars/1
、is_c_fun/1
、update_c_fun/3
。
建立抽象整數文字。
詞彙表示法是 Value
的標準十進位數字。
建立抽象 let 表達式。
如果 Variables
是 [V1, ..., Vn]
,則結果表示 "let <V1, ..., Vn> = Argument in Body
"。所有 Vi
都必須具有 var
類型。
另請參閱:ann_c_let/4
、is_c_let/1
、let_arg/1
、let_arity/1
、let_body/1
、let_vars/1
、update_c_let/4
。
建立抽象 letrec 表達式。
如果 Definitions
是 [{V1, F1}, ..., {Vn, Fn}]
,則結果表示 "letrec V1 = F1 ... Vn = Fn in Body
"。所有 Vi
都必須具有 var
類型並表示函式名稱。所有 Fi
都必須具有 'fun'
類型。
另請參閱:ann_c_letrec/3
、is_c_letrec/1
、letrec_body/1
、letrec_defs/1
、letrec_vars/1
、update_c_letrec/3
。
-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/2
、is_c_map/1
、is_c_map_empty/1
、is_c_map_pattern/1
、map_es/1
、c_map_pair/2
、c_map_pair_exact/2
。
-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/2
或 c_map_pair_exact/2
建構的抽象配對。
另請參閱:ann_c_map/2
、is_c_map/1
、is_c_map_empty/1
、is_c_map_pattern/1
、map_es/1
、c_map_pair/2
、c_map_pair_exact/2
。
-spec c_map_pair(Key :: cerl(), Value :: cerl()) -> c_map_pair().
使用 assoc
運算子建立抽象映射對。
這些只能作為抽象 map 建立運算式或抽象更新運算式的組成部分出現(請參閱 c_map/1
和 c_map/2
)。
結果表示「Key => Value
」。
-spec c_map_pair_exact(Key :: cerl(), Value :: cerl()) -> c_map_pair().
使用 exact
運算子建立抽象映射對。
這些只能作為抽象 map 更新運算式或抽象 map 模式的組成部分出現(請參閱 c_map/1
和 c_map_pattern/1
)。
結果表示「Key := Value
」。
-spec c_map_pattern(Pairs :: [c_map_pair()]) -> c_map().
建立抽象映射模式。
如果 Pairs
為 [E1, ..., EN]
,則結果表示「~{E1, ..., EN}~
」。
所有 Ei
都必須是由 c_map_pair_exact/2
建構的抽象配對。
另請參閱:ann_c_map/2
、is_c_map/1
、is_c_map_empty/1
、is_c_map_pattern/1
、map_es/1
、c_map_pair_exact/2
。
-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
都必須是常數字面值。所有 Vi
和 Ei
都必須具有 var
類型,並表示函式名稱。所有 Fi
都必須具有 'fun'
類型。
另請參閱:ann_c_module/4
、ann_c_module/5
、c_atom/1
、c_fun/2
、c_module/3
、c_var/1
、is_literal/1
、module_attrs/1
、module_defs/1
、module_exports/1
、module_name/1
、module_vars/1
、update_c_module/5
。
-spec c_nil() -> c_literal().
建立抽象空列表。
結果表示「[]
」。空列表傳統上稱為「nil」。
另請參閱:ann_c_nil/1
、c_cons/2
、is_c_list/1
。
建立抽象原始運算呼叫。
如果 Arguments
為 [A1, ..., An]
,則結果表示「primop Name(A1, ..., An)
」。Name
必須是原子字面值。
另請參閱:ann_c_primop/3
、c_apply/2
、c_call/3
、is_c_primop/1
、primop_args/1
、primop_arity/1
、primop_name/1
、update_c_primop/3
。
等同於 c_receive(Clauses, c_atom(infinity), c_atom(true))。
另請參閱:c_atom/1
。
建立抽象 receive 表達式。
如果 Clauses
為 [C1, ..., Cn]
,則結果表示「receive C1 ... Cn after Timeout -> Action end
」。
另請參閱:ann_c_receive/4
、c_receive/1
、is_c_receive/1
、receive_action/1
、receive_clauses/1
、receive_timeout/1
、update_c_receive/4
。
建立抽象序列表達式。
結果表示「do Argument Body
」。
另請參閱:ann_c_seq/3
、is_c_seq/1
、seq_arg/1
、seq_body/1
、update_c_seq/3
。
建立一個抽象的字串文字。
等效於建立相應字元字面值的抽象列表(參見 is_c_string/1
),但通常效率更高。字串的詞法表示為「"Chars"
」,其中 Chars
是一系列可列印的字元或空格。
另請參閱:ann_c_string/2
、c_char/1
、is_c_string/1
、is_print_string/1
、string_lit/1
、string_val/1
。
-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
」。所有 Vi
和 Xi
都必須具有 var
類型。
另請參閱:ann_c_try/6
、c_catch/1
、is_c_try/1
、try_arg/1
、try_body/1
、try_vars/1
、update_c_try/6
。
建立一個抽象的元組。
如果 Elements
為 [E1, ..., En]
,則結果表示「{E1, ..., En}
」。請注意,如果 Elements
中的所有節點都具有 literal
類型,或者 Elements
為空,則結果也會具有 literal
類型,並且會遺失 Elements
中節點的註解。
請回想一下,Erlang 有不同的 1 元組,也就是說,{X}
永遠與 X
本身不同。
另請參閱:ann_c_tuple/2
、c_tuple_skel/1
、is_c_tuple/1
、tuple_arity/1
、tuple_es/1
、update_c_tuple/2
。
建立一個抽象的元組骨架。
不會折疊常數字面值,也就是說,如果 Elements
為 [E1, ..., En]
,則結果永遠具有 tuple
類型,表示「{E1, ..., En}
」。
當需要對 tuple 節點的子節點進行註解時,即使所有子節點都是常數字面值,此函式有時也很有用。但是,請注意,如果將此函式的結果傳遞給 is_literal/1
,則會產生 false
,並且如果傳遞給 concrete/1
則會失敗。
fold_literal/1
可用於將節點還原為標準形式的表示。
另請參閱:ann_c_tuple_skel/2
、c_tuple/1
、concrete/1
、fold_literal/1
、is_c_tuple/1
、is_literal/1
、tuple_es/1
、update_c_tuple_skel/2
。
建立一個抽象的值列表。
如果 Elements
為 [E1, ..., En]
,則結果表示「<E1, ..., En>
」。
另請參閱:ann_c_values/2
、is_c_values/1
、update_c_values/2
、values_arity/1
、values_es/1
。
建立一個抽象的變數。
變數由其名稱識別,該名稱由 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/2
、c_fname/2
、c_letrec/2
、c_module/4
、is_c_var/1
、update_c_var/2
、var_name/1
。
傳回一個抽象的跨模組呼叫的引數子樹列表。
另請參閱:c_call/3
、call_arity/1
。
傳回一個抽象的跨模組呼叫的引數子樹數量。
注意:這等效於 length(call_args(Node))
,但可能更有效率。
另請參閱:c_call/3
、call_args/1
。
傳回一個抽象的跨模組呼叫的模組子樹。
另請參閱:c_call/3
。
傳回一個抽象的跨模組呼叫的名稱子樹。
另請參閱:c_call/3
。
傳回一個抽象的 case 表達式的引數子樹。
另請參閱:c_case/2
。
-spec case_arity(Node :: c_case()) -> non_neg_integer().
等同於 clause_arity(hd(case_clauses(Node)))
,但可能更有效率。
傳回一個抽象的 case 表達式的子句子樹列表。
另請參閱:c_case/2
、case_arity/1
。
傳回一個抽象的 catch 表達式的主體子樹。
另請參閱:c_catch/1
。
-spec char_lit(Node :: c_literal()) -> nonempty_string().
傳回一個抽象字元所代表的文字字串。這包含一個開頭的 $
字元。
目前,所有不在 ISO 8859-1 (Latin-1) 「可列印」字元集中的字元都會被逸出。
另請參閱:c_char/1
。
傳回一個抽象的字元文字所代表的值。
另請參閱:c_char/1
。
-spec clause_arity(Node :: c_clause()) -> non_neg_integer().
傳回一個抽象的子句的模式子樹數量。
注意:這等效於 length(clause_pats(Node))
,但可能更有效率。
另請參閱:c_clause/3
、clause_pats/1
。
傳回一個抽象的子句的主體子樹。
另請參閱:c_clause/3
。
傳回一個抽象的子句的守衛子樹。
另請參閱:c_clause/3
。
傳回一個抽象的子句的模式子樹列表。
另請參閱:c_clause/3
、clause_arity/1
。
傳回一個抽象的子句的模式中所有抽象變數的列表。
列出順序未定義。
另請參閱:c_clause/3
、pat_list_vars/1
。
傳回一個語法樹所代表的 Erlang 項。
如果 Node
不代表文字項,則會拋出例外。
注意:這是一個恆定時間操作。
另請參閱:abstract/1
、is_literal/1
。
傳回一個抽象的列表建構子的頭部子樹。
另請參閱:c_cons/2
。
傳回一個抽象的列表建構子的尾部子樹。
請注意,尾部不一定代表正確的清單。
另請參閱:c_cons/2
。
將使用者註釋列表從 Source
複製到 Target
。
注意:這等效於 set_ann(Target, get_ann(Source))
,但可能更有效率。
-spec data_arity(Node :: c_lct()) -> non_neg_integer().
傳回一個資料建構子節點的子樹數量。
這等效於 length(data_es(Node))
,但可能更有效率。
傳回一個資料建構子節點的子樹列表。
如果建構子的元數為零,則結果為空清單。
注意:如果 data_type(Node)
為 cons
,則子樹的數量恰好為兩個。如果 data_type(Node)
為 {atomic, Value}
,則子樹的數量為零。
傳回一個資料建構子節點的類型描述符。(參見 is_data/1
。)
這主要用於比較類型和建構相同類型的新節點(參閱 make_data/2
)。如果 Node
代表整數、浮點數、原子或空清單,則結果為 {atomic, Value}
,其中 Value
是 concrete(Node)
的值,否則結果為 cons
或 tuple
。
類型描述子可以比較是否相等或順序(在 Erlang 項順序中),但請記住,浮點數的值通常不應測試是否相等。
另請參閱:concrete/1
、is_data/1
、make_data/2
、type/1
。
傳回一個浮點數文字節點所代表的數字字串。
另請參閱:c_float/1
。
傳回一個浮點數文字節點所代表的值。
另請參閱:c_float/1
。
傳回一個抽象的函數名稱變數的 arity 部分。
另請參閱:c_fname/2
、fname_id/1
。
傳回一個抽象的函數名稱變數的識別符部分。
另請參閱:c_fname/2
、fname_arity/1
。
確保文字具有緊湊的表示形式。
如果在建構 Node
時使用了 c_cons_skel/2
、c_tuple_skel/1
或 unfold_literal/1
,並且您想要恢復為文字的正常「摺疊」表示法,則這偶爾很有用。如果 Node
代表元組或清單建構子,則其元素會以遞迴方式重寫,並且使用 c_cons/2
或 c_tuple/1
重新建構節點;否則,Node
不會變更。
另請參閱:c_cons/2
、c_cons_skel/2
、c_tuple/1
、c_tuple_skel/1
、is_literal/1
、unfold_literal/1
。
將一個明確的記錄表示法轉換為對應的抽象語法樹。
記錄定義在檔案「core_parse.hrl
」中。
另請參閱:to_records/1
、type/1
。
傳回一個抽象的 fun 表達式的參數子樹數量。
注意:這等效於 length(fun_vars(Node))
,但可能更有效率。
另請參閱:c_fun/2
、fun_vars/1
。
傳回一個抽象的 fun 表達式的主體子樹。
另請參閱:c_fun/2
。
傳回一個抽象的 fun 表達式的參數子樹列表。
另請參閱:c_fun/2
、fun_arity/1
。
傳回與一個語法樹節點相關聯的使用者註釋列表。
對於新建立的節點,這是一個空清單。註釋可以是任何項。
另請參閱:set_ann/2
。
傳回一個整數文字節點所代表的數字字串。
另請參閱:c_int/1
。
傳回一個整數文字節點所代表的值。
另請參閱:c_int/1
。
如果 Node
是一個抽象的模式別名,則傳回 true
,否則傳回 false
。
另請參閱:c_alias/2
。
如果 Node
是一個抽象的函數應用,則傳回 true
,否則傳回 false
。
另請參閱:c_apply/2
。
如果 Node
代表一個原子文字,則傳回 true
,否則傳回 false
。
另請參閱:c_atom/1
。
如果 Node
是一個抽象的二進制範本,則傳回 true
,否則傳回 false
。
另請參閱:c_binary/1
。
如果 Node
是一個抽象的位元字串範本,則傳回 true
,否則傳回 false
。
另請參閱:c_bitstr/5
。
如果 Node
是一個抽象的跨模組呼叫表達式,則傳回 true
,否則傳回 false
。
另請參閱:c_call/3
。
如果 Node
是一個抽象的 case 表達式,則傳回 true
,否則傳回 false
。
另請參閱:c_case/2
。
如果 Node
是一個抽象的 catch 表達式,則傳回 true
,否則傳回 false
。
另請參閱:c_catch/1
。
如果 Node
可能代表一個字元文字,則傳回 true
,否則傳回 false
。
如果 Erlang 的本機實作將 char/0
定義為 integer/0
的子集,則 is_c_int(Node)
也會產生 true
。
另請參閱:c_char/1
、is_print_char/1
。
如果 Node
是一個抽象的子句,則傳回 true
,否則傳回 false
。
另請參閱:c_clause/3
。
如果 Node
是一個抽象的列表建構子,則傳回 true
,否則傳回 false
。
如果 Node
代表一個浮點數文字,則傳回 true
,否則傳回 false
。
另請參閱:c_float/1
。
如果 Node
是一個抽象的函數名稱變數,則傳回 true
,否則傳回 false
。
另請參閱:c_fname/2
、c_var/1
、var_name/1
。
如果 Node
是一個抽象的 fun 表達式,則傳回 true
,否則傳回 false
。
另請參閱:c_fun/2
。
如果 Node
代表一個整數文字,則傳回 true
,否則傳回 false
。
另請參閱:c_int/1
。
如果 Node
是一個抽象的 let 表達式,則傳回 true
,否則傳回 false
。
另請參閱:c_let/3
。
如果 Node
是一個抽象的 letrec 表達式,則傳回 true
,否則傳回 false
。
另請參閱:c_letrec/2
。
如果 Node
代表一個正確的列表,則傳回 true
,否則傳回 false
。
正確的清單不是空清單 []
,就是 cons cell [Head | Tail]
,其中遞迴地 Tail
是正確的清單。
注意:因為 Node
是語法樹,所以對應於其子樹的實際執行階段值通常可能是部分或完全未知的。因此,如果 Node
例如代表「[... | Ns]
」(其中 Ns
是一個變數),則該函式將傳回 false
,因為不知道 Ns
是否會在執行階段繫結到清單。如果 Node
例如代表「[1, 2, 3]
」或「[A | []]
」,則該函式將傳回 true
。
如果 Node
是任何種類的抽象映射(用於建構、更新或匹配),則傳回 true
,否則傳回 false
。
如果 Node
代表一個空的抽象映射,則傳回 true
,否則傳回 false
。
另請參閱:c_map/1
、c_map_pattern/1
。
如果 Node
是一個抽象的映射模式,則傳回 true
,否則傳回 false
。
另請參閱:c_map/1
、c_map_pattern/1
。
如果 Node
是一個抽象的模組定義,則傳回 true
,否則傳回 false
。
另請參閱:type/1
。
如果 Node
是一個抽象的空列表,則傳回 true
,否則傳回 false
。
如果 Node
是一個抽象的原始操作呼叫,則傳回 true
,否則傳回 false
。
另請參閱:c_primop/2
。
如果 Node
是一個抽象的 receive 表達式,則傳回 true
,否則傳回 false
。
另請參閱:c_receive/3
。
如果 Node
是一個抽象的序列表達式,則傳回 true
,否則傳回 false
。
另請參閱:c_seq/2
。
如果 Node
可能代表一個字串文字,則傳回 true
,否則傳回 false
。
字串定義為字元清單;有關詳細資訊,請參閱 is_c_char/1
。
如果 Node
是一個抽象的 try 表達式,則傳回 true
,否則傳回 false
。
另請參閱:c_try/5
。
如果 Node
是一個抽象的元組,則傳回 true
,否則傳回 false
。
另請參閱:c_tuple/1
。
如果 Node
是一個抽象的值列表,則傳回 true
,否則傳回 false
。
另請參閱:c_values/1
。
如果 Node
是一個抽象的變數,則傳回 true
,否則傳回 false
。
另請參閱:c_var/1
。
如果 Node
代表一個資料建構子,則傳回 true
,否則傳回 false
。
資料建構子是 cons cell、元組和原子文字。
另請參閱:data_arity/1
、data_es/1
、data_type/1
。
如果 Node
是一個葉節點,則傳回 true
,否則傳回 false
。
目前的葉節點類型為 literal
和 var
。
注意:所有文字(參閱 is_literal/1
)都是葉節點,即使它們代表結構化(常數)值(例如 {foo, [bar, baz]}
)。另請注意,變數是葉節點,但不是文字。
另請參閱:is_literal/1
、type/1
。
如果 Node
代表一個文字項,則傳回 true
,否則傳回 false
。
當且僅當 concrete(Node)
的值已定義時,此函式才會傳回 true
。
注意:這是一個恆定時間操作。
如果 Term
可以表示為一個文字,則傳回 true
,否則傳回 false
。
此函式所需的時間與 Term
的大小成正比。
另請參閱:abstract/1
。
如果 Node
可能代表一個「可列印」字元,則傳回 true
,否則傳回 false
。(參見 is_c_char/1
。)
「可列印」字元具有給定的圖形表示法,或「命名」的逸出序列(例如「\n
」)。目前,僅識別 ISO 8859-1 (Latin-1) 字元值。
另請參閱:c_char/1
、is_c_char/1
。
如果 Node
可能代表一個只包含「可列印」字元的字串文字,則傳回 true
,否則傳回 false
。
有關詳細資訊,請參閱 is_c_string/1
和 is_print_char/1
。目前,僅識別 ISO 8859-1 (Latin-1) 字元值。
傳回一個抽象的 let 表達式的引數子樹。
另請參閱:c_let/3
。
-spec let_arity(Node :: c_let()) -> non_neg_integer().
傳回一個抽象的 let 表達式的左側變數數量。
注意:這等效於 length(let_vars(Node))
,但可能更有效率。
另請參閱:c_let/3
、let_vars/1
。
傳回一個抽象的 let 表達式的主體子樹。
另請參閱:c_let/3
。
傳回一個抽象的 let 表達式的左側變數列表。
另請參閱:c_let/3
、let_arity/1
。
傳回一個抽象的 letrec 表達式的主體子樹。
另請參閱:c_letrec/2
。
傳回一個抽象的 letrec 表達式的定義列表。
如果 Node
代表「letrec V1 = F1 ... Vn = Fn in Body
」,則傳回值為 [{V1, F1}, ..., {Vn, Fn}]
。
另請參閱:c_letrec/2
。
傳回一個抽象的 letrec 表達式的左側函數變數子樹列表。
如果 Node
代表「letrec V1 = F1 ... Vn = Fn in Body
」,則傳回值為 [V1, ..., Vn]
。
另請參閱:c_letrec/2
。
傳回一個抽象列表的元素子樹列表。
Node
必須代表正確的清單。例如,如果 Node
代表「[X1, X2 | [X3, X4 | []]
」,則 list_elements(Node)
會產生清單 [X1, X2, X3, X4]
。
另請參閱:c_cons/2
、c_nil/0
、is_c_list/1
、list_length/1
、make_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))
,但可能更有效率。
建立一個具有指定類型和子樹的資料建構子節點。(參見 data_type/1
。)
如果 Elements
的長度對於給定的 Type
無效,則會拋出異常;有關建構子類型的元數限制,請參閱 data_es/1
。
另請參閱:ann_make_data/3
、data_es/1
、data_type/1
、make_data_skel/2
、update_data/3
。
類似於 make_data/2
,但類似於 c_tuple_skel/1
和 c_cons_skel/2
。
另請參閱:ann_make_data_skel/3
、c_cons_skel/2
、c_tuple_skel/1
、make_data/2
、update_data_skel/3
。
從 List
中的元素和可選的 Tail
建立一個抽象列表。
如果 Tail
為 none
,則結果將表示一個以 nil 結尾的列表,否則它表示 "[... | Tail]
"。
另請參閱:ann_make_list/3
、c_cons/2
、c_nil/0
、list_elements/1
、update_list/3
。
建立一個具有指定類型和子樹的語法樹。
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/3
、is_leaf/1
、subtrees/1
、type/1
、update_tree/2
。
傳回一個抽象映射的引數子樹。
另請參閱:c_map/2
。
-spec map_es(Node :: c_map() | c_literal()) -> [c_map_pair()].
傳回一個抽象映射的映射對子樹列表。
另請參閱:c_map/1
。
-spec map_pair_key(Node :: c_map_pair()) -> cerl().
傳回一個抽象映射對的鍵子樹。
-spec map_pair_op(Node :: c_map_pair()) -> map_op().
傳回一個抽象映射對的操作子樹。
-spec map_pair_val(Node :: c_map_pair()) -> 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/1
、get_ann/1
、type/1
。
傳回一個抽象的模組定義的屬性鍵/值子樹對列表。
另請參閱:c_module/4
。
傳回一個抽象的模組定義的函數定義列表。
另請參閱:c_module/4
。
傳回一個抽象的模組定義的匯出子樹列表。
另請參閱:c_module/4
。
傳回一個抽象的模組定義的名稱子樹。
另請參閱:c_module/4
。
傳回一個抽象的模組定義的左側函數變數子樹列表。
另請參閱:c_module/4
。
傳回給定模式中所有抽象變數的列表。
如果 Patterns
中的某些元素不表示格式正確的 Core Erlang 條款模式,則會拋出異常。列表的順序未定義。
另請參閱:clause_vars/1
、pat_vars/1
。
傳回一個模式中所有抽象變數的列表。
如果 Node
不表示格式正確的 Core Erlang 條款模式,則會拋出異常。列表的順序未定義。
另請參閱:clause_vars/1
、pat_list_vars/1
。
傳回抽象基本運算呼叫的引數子樹列表。
另請參閱:c_primop/2
、primop_arity/1
。
傳回抽象基本運算呼叫的引數子樹數量。
注意:這等同於 length(primop_args(Node))
,但可能更有效率。
另請參閱:c_primop/2
、primop_args/1
。
傳回抽象基本運算呼叫的名稱子樹。
另請參閱:c_primop/2
。
傳回抽象接收表達式的動作子樹。
另請參閱:c_receive/3
。
傳回抽象接收表達式的子句子樹列表。
另請參閱:c_receive/3
。
傳回抽象接收表達式的逾時子樹。
另請參閱:c_receive/3
。
傳回抽象循序表達式的引數子樹。
另請參閱:c_seq/2
。
傳回抽象循序表達式的主體子樹。
另請參閱:c_seq/2
。
將 節點
的使用者註解列表設定為 註解
。
另請參閱:add_ann/2
、copy_ann/2
、get_ann/1
。
-spec string_lit(Node :: c_literal()) -> nonempty_string().
傳回由抽象字串表示的字串文字。這包含周圍的雙引號字元 "..."
。
目前,除了空格之外,不在 ISO 8859-1 (Latin-1) 「可列印」字元集合中的字元將會被逸出。
另請參閱:c_string/1
。
傳回由抽象字串文字表示的值。
另請參閱:c_string/1
。
傳回節點的所有子樹分組列表。
如果 Node
是葉節點(參閱 is_leaf/1
),則這是空列表,否則結果始終為非空列表,其中包含 Node
的子樹列表,以從左到右的順序排列,就像它們在列印的程式文字中出現一樣,並按類別分組。通常,每個群組只包含一個子樹。
根據 Node
的類型,某些群組的大小可能會有所不同(例如,包含元組的所有元素的群組),而其他群組始終包含相同數量的元素 - 通常恰好一個(例如,包含 case 表達式的引數表達式的群組)。但是請注意,返回列表的確切結構(對於給定的節點類型)通常不應依賴,因為它可能會在不另行通知的情況下變更。
如果想要遍歷語法樹,拜訪其所有子樹,但在大多數或所有情況下以統一的方式處理樹的節點,則函數 subtrees/1
和建構子函數 make_tree/2
和 update_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_」,但其他任何內容(包括註釋)都沒有變更。
將抽象語法樹轉換為對應的明確記錄表示法。
記錄定義在檔案「cerl.hrl
」中。
另請參閱:from_records/1
、type/1
。
傳回抽象 try 表達式的表達式子樹。
另請參閱:c_try/5
。
傳回抽象 try 表達式的成功主體子樹。
另請參閱:c_try/5
。
傳回抽象 try 表達式的例外變數子樹列表。
另請參閱:c_try/5
。
傳回抽象 try 表達式的例外主體子樹。
另請參閱:c_try/5
。
傳回抽象 try 表達式的成功變數子樹列表。
另請參閱:c_try/5
。
-spec tuple_arity(Node :: c_tuple() | c_literal()) -> non_neg_integer().
傳回抽象元組的元素子樹數量。
注意:這等同於 length(tuple_es(Node))
,但可能更有效率。
另請參閱:c_tuple/1
、tuple_es/1
。
傳回抽象元組的元素子樹列表。
另請參閱:c_tuple/1
。
傳回 節點
的類型標籤。
目前的節點類型為
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/1
、c_alias/2
、c_apply/2
、c_binary/1
、c_bitstr/5
、c_call/3
、c_case/2
、c_catch/1
、c_clause/3
、c_cons/2
、c_fun/2
、c_let/3
、c_letrec/2
、c_module/3
、c_primop/2
、c_receive/1
、c_seq/2
、c_try/5
、c_tuple/1
、c_values/1
、c_var/1
、data_type/1
、from_records/1
、get_ann/1
、meta/1
、subtrees/1
、to_records/1
。
確保文字具有完整展開的表示法。
如果 Node
表示文字元組或列表建構子,則其元素將以遞迴方式重寫,並分別使用 c_cons_skel/2
或 c_tuple_skel/1
重建節點;否則,Node
不會變更。fold_literal/1
可用於還原為正常的精簡表示形式。
另請參閱:c_cons/2
、c_cons_skel/2
、c_tuple/1
、c_tuple_skel/1
、fold_literal/1
、is_literal/1
。
另請參閱:c_alias/2
。
另請參閱:c_apply/2
。
另請參閱:c_binary/1
。
-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
。
-spec update_c_call(Node :: cerl(), Module :: cerl(), Name :: cerl(), Arguments :: [cerl()]) -> c_call().
另請參閱:c_call/3
。
另請參閱:c_case/2
。
另請參閱:c_catch/1
。
-spec update_c_clause(Node :: c_clause(), Patterns :: [cerl()], Guard :: cerl(), Body :: cerl()) -> c_clause().
另請參閱:c_clause/3
。
-spec update_c_cons(Node :: c_literal() | c_cons(), Head :: cerl(), Tail :: cerl()) -> c_literal() | c_cons().
另請參閱:c_cons/2
。
-spec update_c_cons_skel(Node :: c_cons() | c_literal(), Head :: cerl(), Tail :: cerl()) -> c_cons().
另請參閱:c_cons_skel/2
。
類似 update_c_fname/3
,但從 節點
取得元數。
另請參閱:c_fname/2
、update_c_fname/3
。
等同於 update_c_var(舊, {原子, 元數})。
另請參閱:c_fname/2
、update_c_fname/2
。
另請參閱:c_fun/2
。
-spec update_c_let(Node :: c_let(), Variables :: [cerl()], Argument :: cerl(), Body :: cerl()) -> c_let().
另請參閱:c_let/3
。
-spec update_c_letrec(Node :: c_letrec(), Definitions :: [{cerl(), cerl()}], Body :: cerl()) -> c_letrec().
另請參閱:c_letrec/2
。
-spec update_c_map(Node :: c_map(), Map :: cerl(), Pairs :: [c_map_pair()]) -> c_map() | c_literal().
另請參閱:c_map/1
、c_map_pattern/1
。
-spec update_c_map_pair(Node :: c_map_pair(), Operation :: map_op(), Key :: cerl(), Value :: cerl()) -> c_map_pair().
-spec update_c_module(Node :: c_module(), Name :: cerl(), Exports :: [cerl()], Attributes :: [{cerl(), cerl()}], Definitions :: [{cerl(), cerl()}]) -> c_module().
另請參閱:c_module/4
。
另請參閱:c_primop/2
。
-spec update_c_receive(Node :: c_receive(), Clauses :: [cerl()], Timeout :: cerl(), Action :: cerl()) -> c_receive().
另請參閱:c_receive/3
。
另請參閱:c_seq/2
。
-spec update_c_try(Node :: c_try(), Argument :: cerl(), Variables :: [cerl()], Body :: cerl(), ExceptionVars :: [cerl()], Handler :: cerl()) -> c_try().
另請參閱:c_try/5
。
-spec update_c_tuple(Node :: c_tuple() | c_literal(), Elements :: [cerl()]) -> c_tuple() | c_literal().
另請參閱:c_tuple/1
。
另請參閱:c_tuple_skel/1
。
另請參閱:c_values/1
。
另請參閱:c_var/1
。
另請參閱:make_data/2
。
另請參閱:make_data_skel/2
。
另請參閱:make_list/2
、update_list/2
。
使用給定的子樹建立語法樹,並具有與節點 節點
相同的類型和註解。
這等同於 ann_make_tree(get_ann(Node), type(Node), Groups)
,但可能更有效率。
使用給定的類型和子樹建立語法樹,並具有與節點 節點
相同的註解。
這等同於 ann_make_tree(get_ann(Node), Type, Groups)
,但可能更有效率。
-spec values_arity(Node :: c_values()) -> non_neg_integer().
傳回抽象值列表的元素子樹數量。
注意:這等同於 length(values_es(Node))
,但可能更有效率。
另請參閱:c_values/1
、values_es/1
。
傳回抽象值列表的元素子樹列表。
另請參閱:c_values/1
、values_arity/1
。
傳回抽象變數的名稱。
另請參閱:c_var/1
。