5 | DefineClass of string * Ast.name * string list
6 | DefineMethod of string * (string * string) * string list * Ast.expr
8 type program = stmt list
10 module Set = Core.Std.Set
11 type 'a set = 'a Set.t
14 List.fold_left (flip Set.add) Set.empty xs
18 - convert DefineClass & DefineMethod to Ast.Class
19 - convert Ast.Call to Ast.Invoke
22 let methods_table program =
27 DefineMethod (name,(self,klass),args,body) ->
28 Hashtbl.add tbl klass (name,self::args,body)
33 let methods_set program =
34 set_of_list @@ HList.concat_map
36 DefineMethod (name,_,_,_) ->
43 Ast.Call ((Ast.Var f)::obj::args) when Set.mem f set ->
44 Ast.Invoke (obj,f,args)
48 let stmt_trans tbl set =
51 [Ast.lift_stmt (expr_trans set) stmt]
52 | DefineClass (klass,super,_) ->
53 [Ast.Class (klass,super,Hashtbl.find_all tbl klass)]
59 methods_table program in
61 methods_set program in
62 program +> HList.concat_map (stmt_trans tbl methods)
67 Ast.to_string_stmt stmt
68 | DefineClass (name,(ns,super),attrs) ->
69 Printf.sprintf "Class (%s,%s::%s,%s)"
73 | DefineMethod (f,(self,klass),args,body) ->
74 Printf.sprintf "Metod (%s,((%s %s) %s),%s)"
75 f self klass (string_of_list args) (Ast.to_string body)