let rec to_inner_expr (e: void expr)
: inner expr =
let f = to_inner_expr in
begin match e with
| X(_) -> assert false
| Null -> Null
| Bool(b) -> Bool(b)
| Int(n) -> Int(n)
| String(s) -> String(s)
| Url(u) -> Url(u)
| Type(t) -> Type(t)
| Code(e) -> Code(e)
| Eval(e) -> Eval(f e)
| Var(x) -> Var(x)
| Function(x, xs, e) -> Function(x, xs, f e)
| Apply(e1, e2) -> Apply(f e1, f e2)
| Prim1(s, e1) -> Prim1(s, f e1)
| Prim2(s, e1, e2) -> Prim2(s, f e1, f e2)
| Alert(e1) -> Alert(f e1)
| If(e1, e2, e3) -> If(f e1, f e2, f e3)
| While(e1, e2) -> While(f e1, f e2)
| Set_var(var, e1) -> Set_var(var, f e1)
| Seq(e1, e2) -> Seq(f e1, f e2)
| Get_cookie(e1, e2) -> Get_cookie(f e1, f e2)
| Set_cookie(e1, e2, e3) -> Set_cookie(f e1, f e2, f e3)
| Xhr(e1, e2, e3) -> Xhr(f e1, f e2, f e3)
| Self_win -> Self_win
| Named_win(e1) -> Named_win(f e1)
| Open_win(e1) -> Open_win(f e1)
| Open_named_win(e1, e2) -> Open_named_win(f e1, f e2)
| Close_win(e1) -> Close_win(f e1)
| Navigate_win(e1, e2) -> Navigate_win(f e1, f e2)
| Is_win_closed(e1) -> Is_win_closed(f e1)
| Get_win_opener(e1) -> Get_win_opener(f e1)
| Get_win_location(e1) -> Get_win_location(f e1)
| Get_win_name(e1) -> Get_win_name(f e1)
| Set_win_name(e1, e2) -> Set_win_name(f e1, f e2)
| Get_win_root_node(e1) -> Get_win_root_node(f e1)
| Set_win_root_node(e1, e2) -> Set_win_root_node(f e1, f e2)
| Get_win_var(e1, var) -> Get_win_var(f e1, var)
| Set_win_var(e1, var, e2) -> Set_win_var(f e1, var, f e2)
| New_node(e) -> New_node(f e)
| Get_node_type(e) -> Get_node_type(f e)
| Get_node_contents(e) -> Get_node_contents(f e)
| Set_node_contents(e1, e2) -> Set_node_contents(f e1, f e2)
| Get_node_attr(e1, e2) -> Get_node_attr(f e1, f e2)
| Set_node_attr(e1, e2, e3) -> Set_node_attr(f e1, f e2, f e3)
| Remove_handlers(e) -> Remove_handlers(f e)
| Add_handler(e1, e2) -> Add_handler(f e1, f e2)
| Get_parent(e) -> Get_parent(f e)
| Get_child(e1, e2) -> Get_child(f e1, f e2)
| Insert_node(e1, e2, e3) -> Insert_node(f e1, f e2, f e3)
| Remove_node(e) -> Remove_node(f e)
end