let rec to_inner_expr (e: void expr)
  : inner expr =
    let f = to_inner_expr in
    begin match e with
    | X(_) -> assert false (* unreachable case *)
    | 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