let declare_variable env name =
        let find_or_declare varmaps nextind uid =
                try let (_, uid) = StringMap.find name varmaps in (varmaps, 0, uid)
                with Not_found -> (StringMap.add name (nextind, uid) varmaps, 1, uid)
        in
        match env.locals with
        | [] ->
                        let ( map, num_added, uid) = find_or_declare env.globals.variable_map env.num_globals env.unique_id
                        in
                        ({ globals ={ variable_map = map; parent = env.globals.parent };
                                        num_globals = env.num_globals + num_added;
                                        locals = env.locals;
                                        num_locals = env.num_locals;
                                        sdepth = env.sdepth;
                                        max_depth = env.max_depth;
                                        errors = env.errors;
                                        warnings = env.warnings;
                                        unique_id = env.unique_id + num_added;
                                        names = if num_added = 0 then env.names else name:: env.names;
                                        varprops = env.varprops;
                                        imported = env.imported;
                                        templates = env.templates;
                                        constants = env.constants;
                                }, uid)
        | _ ->
                        let (map, num_added, uid) = find_or_declare (List.hd env.locals).variable_map (List.hd env.num_locals) env.unique_id
                        in
                        ({ globals = env.globals;
                                        num_globals = env.num_globals;
                                        locals ={ variable_map = map; parent = (List.hd env.locals).parent }:: List.tl env.locals;
                                        num_locals = ((List.hd env.num_locals) + num_added):: List.tl env.num_locals;
                                        sdepth = env.sdepth;
                                        max_depth = env.max_depth;
                                        errors = env.errors;
                                        warnings = env.warnings;
                                        unique_id = env.unique_id + num_added;
                                        names = if num_added = 0 then env.names else name:: env.names;
                                        varprops = env.varprops;
                                        imported = env.imported;
                                        templates = env.templates;
                                        constants = env.constants;
                                }, uid)