如果 C 是 catch 子句X : P when Gs -> B,其中X是原子文字或变量模式, P是模式,Gs是保护序列,B是主体,则 Rep(C) = {子句,ANNO,[Rep({X,P,_})],Rep(Gs),Rep(B)},即带有显式异常类和显式堆栈跟踪变量_的 catch 子句无法与带有显式异常类且没有显式堆栈跟踪变量的 catch 子句。
如果 C 是 catch 子句X : P : S 当 Gs -> B 时,其中X是原子文字或变量模式, P是模式,Gs是保护序列, S是变量,B是主体,然后 Rep(C) = {clause,ANNO,[Rep({X,P,S})],Rep(Gs),Rep(B)}。
如果 C 是函数子句( Ps ) -> B,其中Ps是模式序列而B是主体,则 Rep(C) = {clause,ANNO,Rep(Ps),[],Rep(B)}。
如果 C 是Gs -> B 时的函数子句( Ps ),其中Ps是模式序列, Gs是保护序列,B是主体,则 Rep(C) = {clause,ANNO,Rep(Ps),Rep (Gs),Rep(B)}。
如果 C 是 if 子句Gs -> B,其中Gs是保护序列,B是主体,则 Rep(C) = {clause,ANNO,[],Rep(Gs),Rep(B)}。
If C is a case clause P -> B, 其中P是模式,B是主体,则 Rep(C) = {clause,ANNO,[Rep(P)],[],Rep(B)}。
If C is a case clause P when Gs -> B, 其中P是模式, Gs是保护序列,B是主体,则 Rep(C) = {clause,ANNO,[Rep(P)],Rep (Gs),Rep(B)}。
If C is a catch clause P -> B, 其中P是模式,B是主体,则 Rep(C) = {clause,ANNO,[Rep({throw,P,_})],[],Rep (B)},即带有显式异常类 throw且带有或不带有显式堆栈跟踪变量_的 catch 子句无法与没有显式异常类和显式堆栈跟踪变量的 catch 子句区分开来。
If C is a catch clause X : P -> B, 其中X是原子文字或变量模式, P是模式,B是主体,则 Rep(C) = {clause,ANNO,[Rep({ X,P,_})],[],Rep(B)},即带有显式异常类和显式堆栈跟踪变量_的 catch 子句不能与带有显式异常类且没有显式异常类的 catch 子句区分开来显式堆栈跟踪变量。
If C is a catch clause X : P : S -> B, 其中X是原子文字或变量模式, P是模式,S是变量,B 是主体,则 Rep(C) = {clause ,ANNO,[Rep({X,P,S})],[],Rep(B)}。
If C is a catch clause P when Gs -> B, 其中P是模式,Gs是保护序列,B是主体,则 Rep(C) = {clause,ANNO,[Rep({throw,P, _})],Rep(Gs),Rep(B)},即带有显式异常类 throw和带有或不带有显式堆栈跟踪变量_的 catch 子句不能与没有显式异常类的 catch 子句区分开来,并且没有显式的堆栈跟踪变量。
If C is a catch clause X : P when Gs -> B, 其中X是原子文字或变量模式, P是模式,Gs是保护序列,B是主体,则 Rep(C) = {子句,ANNO,[Rep({X,P,_})],Rep(Gs),Rep(B)},即带有显式异常类和显式堆栈跟踪变量_的 catch 子句无法与带有显式异常类且没有显式堆栈跟踪变量的 catch 子句。
If C is a catch clause X : P : S when Gs -> B, 其中X是原子文字或变量模式, P是模式,Gs是保护序列, S是变量,B是主体,然后 Rep(C) = {clause,ANNO,[Rep({X,P,S})],Rep(Gs),Rep(B)}。
If C is a function clause ( Ps ) -> B,其中Ps是模式序列而B是主体,则 Rep(C) = {clause,ANNO,Rep(Ps),[],Rep(B)}。
If C is a function clause ( Ps ) when Gs -> B, 其中Ps是模式序列, Gs是保护序列,B是主体,则 Rep(C) = {clause,ANNO,Rep(Ps),Rep (Gs),Rep(B)}。
If C is an if clause Gs -> B, 其中Gs是保护序列,B是主体,则 Rep(C) = {clause,ANNO,[],Rep(Gs),Rep(B)}。
如果 Gt 是变量模式V,则 Rep(Gt) = {var,ANNO,A},其中 A 是一个原子,其打印名称由与V相同的字符组成。
If Gt is an atomic literal L,则 Rep(Gt) = Rep(L)。
If Gt is a bitstring constructor<<Gt_1:Size_1/TSL_1,...,Gt_k:Size_k/TSL_k>>, 其中每个Size_i是一个保护测试,每个 TSL_i是一个类型指定列表,那么 Rep(Gt) = {bin ,ANNO,[{bin_element,ANNO,Rep(Gt_1),Rep(Size_1),Rep(TSL_1)}, ..., {bin_element,ANNO,Rep(Gt_k),Rep(Size_k),Rep(TSL_k)}] } . 对于 Rep(TSL),请参见上文。默认情况下表示省略的Size_i。默认情况下表示省略的TSL_i。
If Gt is a cons skeleton [Gt_h | Gt_t], 然后 Rep(Gt) = {cons,ANNO,Rep(Gt_h),Rep(Gt_t)}。
If Gt is a function call A(Gt_1, ..., Gt_k), 其中A是一个原子,那么 Rep(Gt) = {call,ANNO,Rep(A),[Rep(Gt_1), ..., Rep (Gt_k)]}。
If Gt is a function call A_m:A(Gt_1, ..., Gt_k),其中A_m是原子erlang并且A是原子或运算符,则 Rep(Gt) = {call,ANNO,{remote,ANNO, Rep(A_m),Rep(A)},[Rep(Gt_1), ..., Rep(Gt_k)]} .
If Gt is a map creation #{A_1, ..., A_k}, 其中每个A_i是一个关联Gt_i_1 => Gt_i_2,那么 Rep(Gt) = {map,ANNO,[Rep(A_1), ..., Rep (A_k)]}。对于Rep(A),见上文。
If Gt is a map update Gt_0#{A_1, ..., A_k}, 其中每个A_i是一个关联Gt_i_1 => Gt_i_2 或Gt_i_1 := Gt_i_2,则 Rep(Gt) = {map,ANNO,Rep(Gt_0), [Rep(A_1), ..., Rep(A_k)]} . 对于Rep(A),见上文。
If Gt is nil, [], 则 Rep(Gt) = {nil,ANNO}。
If Gt is an operator guard test Gt_1 Op Gt_2,其中Op是除 match operator =之外的二元运算符,则 Rep(Gt) = {op,ANNO,Op,Rep(Gt_1),Rep(Gt_2)}。
If Gt is an operator guard test Op Gt_0, 其中Op是一元运算符,则 Rep(Gt) = {op,ANNO,Op,Rep(Gt_0)}。
If Gt is a parenthesized guard test ( Gt_0 ), 那么 Rep(Gt) = Rep(Gt_0),即括号内的守卫测试无法与其主体区分开来。
If Gt is a record creation #Name{Field_1=Gt_1, ..., Field_k=Gt_k},其中每个Field_i是一个原子或_,则 Rep(Gt) = {record,ANNO,Name,[{record_field,ANNO, Rep(Field_1),Rep(Gt_1)}, ..., {record_field,ANNO,Rep(Field_k),Rep(Gt_k)}]}。
If Gt is a record field access Gt_0#Name.Field,其中Field是原子,则 Rep(Gt) = {record_field,ANNO,Rep(Gt_0),Name,Rep(Field)}。
If Gt is a record field index #Name.Field, 其中Field是原子,则 Rep(Gt) = {record_index,ANNO,Name,Rep(Field)}。
If Gt is a tuple skeleton {Gt_1, ..., Gt_k}, 则 Rep(Gt) = {tuple,ANNO,[Rep(Gt_1), ..., Rep(Gt_k)]}。
If Gt is a variable pattern V, then Rep(Gt) = {var,ANNO,A}, 其中 A 是一个原子,其打印名称由与V相同的字符组成。
请注意,每个保护测试都与某个表达式具有相同的源形式,并以与相应表达式相同的方式表示。
# 8.7 类型
如果 T 是带注释的类型A :: T_0,其中A是变量,则 Rep(T) = {ann_type,ANNO,[Rep(A),Rep(T_0)]}。
如果 T 是原子、字符或整数文字 L,则 Rep(T) = Rep(L)。
如果 T 是位串类型<<_:M,_:_*N>>,其中M和N是单例整数类型,则 Rep(T) = {type,ANNO,binary,[Rep(M),Rep( N)]}。
如果 T 是空列表类型[],则 Rep(T) = {type,ANNO,nil,[]},即空列表类型 []无法与预定义类型nil()区分开来 。
如果 T 是一个有趣的类型fun(),那么 Rep(T) = {type,ANNO,'fun',[]}。
如果 T 是一个有趣的类型fun((...) -> T_0),那么 Rep(T) = {type,ANNO,'fun',[{type,ANNO,any},Rep(T_0)]}。
如果 T 是一个有趣的类型fun(Ft),其中 Ft是一个函数类型,那么 Rep(T) = Rep(Ft)。对于Rep(Ft),见下文。
如果 T 是整数范围类型L .. H,其中L和H是单例整数类型,则 Rep(T) = {type,ANNO,range,[Rep(L),Rep(H)]}。
If Ft is a constrained function type Ft_1 when Fc, 其中Ft_1是函数类型而 Fc是函数约束,则 Rep(T) = {type,ANNO,bounded_fun,[Rep(Ft_1),Rep(Fc)]}。对于Rep(Fc),见下文。
If Ft is a function type (T_1, ..., T_n) -> T_0, 其中每个T_i都是一个类型,那么 Rep(Ft) = {type,ANNO,'fun',[{type,ANNO,product,[ Rep(T_1), ..., Rep(T_n)]},Rep(T_0)]} .