6 let eq_ident {value = x} {value = y} =
11 `Int {value = x}, `Int {value = y} ->
13 | `String {value = x}, `String {value = y} ->
15 | `Bool {value = x}, `Bool {value = y} ->
17 | `Float {value = x}, `Float {value = y} ->
19 | `Var {value = x}, `Var {value = y} ->
21 | `Lambda (args,expr), `Lambda (args',expr') ->
22 (List.for_all2 eq_ident args args') && eq_expr expr expr'
23 | `Call args, `Call args' ->
24 List.for_all2 eq_expr args args'
25 | `If (a,b,c), `If (a',b',c') ->
26 List.for_all2 eq_expr [a;b;c] [a';b';c']
27 | `Let (decls,body), `Let (decls',body')
28 | `LetRec (decls,body), `LetRec (decls',body') ->
31 (fun (v,e) (v',e') -> eq_ident v v' && eq_expr e e')
33 b && eq_expr body body'
34 | `Block xs, `Block xs' ->
35 List.for_all2 eq_expr xs xs'
36 | `New ({value=name},args), `New ({value=name'},args') ->
37 name = name' && HList.conj @@ List.map2 eq_expr args args'
38 | `Invoke (obj,name,args), `Invoke (obj',name',args') ->
39 eq_expr obj obj' && eq_ident name name' &&
40 List.for_all2 eq_expr args args'
41 | `SlotRef (obj,name), `SlotRef (obj',name') ->
42 eq_expr obj obj' && eq_ident name name'
43 | `SlotSet (obj,name,value), `SlotSet (obj',name',value') ->
44 eq_expr obj obj' && eq_ident name name' && eq_expr value' value'
48 let eq_method (name,args,body) (name',args',body') =
49 eq_ident name name' &&
50 (List.for_all2 eq_ident args args') &&
55 `Define (name,body), `Define (name',body') ->
56 eq_ident name name' && eq_expr body body'
57 | `Expr expr, `Expr expr' ->
59 | `Class (name,{value=super},attrs,methods),
60 `Class (name',{value=super'},attrs',methods') ->
61 eq_ident name name' &&
63 (List.for_all2 eq_ident attrs attrs') &&
64 (List.for_all2 eq_method methods methods')
70 `DefineClass (name,{value=super},attrs), `DefineClass (name',{value=super'},attrs') ->
71 eq_ident name name' &&
72 super = super' && List.for_all2 eq_ident attrs attrs'
73 | `DefineMethod (name,(self,obj),args,body), `DefineMethod (name',(self',obj'),args',body') ->
74 eq_ident name name' &&
75 eq_ident self self' &&
77 (List.for_all2 eq_ident args args') &&