diff options
-rw-r--r-- | eval.c | 1 | ||||
-rw-r--r-- | lib.c | 19 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | txr.1 | 23 |
4 files changed, 44 insertions, 0 deletions
@@ -6670,6 +6670,7 @@ void eval_init(void) reg_fun(intern(lit("make-anon-package"), system_package), func_n0(make_anon_package)); reg_fun(intern(lit("find-package"), user_package), func_n1(find_package)); reg_fun(intern(lit("delete-package"), user_package), func_n1(delete_package)); + reg_fun(intern(lit("merge-delete-package"), user_package), func_n2o(merge_delete_package, 1)); reg_fun(intern(lit("package-alist"), user_package), func_n0(package_alist)); reg_fun(intern(lit("package-name"), user_package), func_n1(package_name)); reg_fun(intern(lit("package-symbols"), user_package), func_n1(package_symbols)); @@ -5177,6 +5177,25 @@ val delete_package(val package_in) return nil; } +val merge_delete_package(val to_in, val victim_in) +{ + val self = lit("merge-delete-package"); + val to = get_package(self, to_in, nil); + val victim = get_package(self, victim_in, t); + struct hash_iter hi; + val cell; + + us_hash_iter_init(&hi, victim->pk.symhash); + + while ((cell = hash_iter_next(&hi))) { + val sym = us_cdr(cell); + if (symbol_package(sym) == victim) + rehome_sym(sym, to); + } + + return delete_package(victim); +} + val package_alist(void) { return deref(cur_package_alist_loc); @@ -899,6 +899,7 @@ val make_anon_package(void); val packagep(val obj); val find_package(val name); val delete_package(val package); +val merge_delete_package(val to, val victim); val package_alist(void); val package_name(val package); val package_symbols(val package); @@ -52801,6 +52801,29 @@ are scrubbed of any foreign symbols which are the local symbols of the deleted .metn package . +.coNP Function @ merge-delete-package +.synb +.mets (merge-delete-package dst-package <> [ src-package ]) +.syne +.desc +The +.code merge-delete-package +iterates over all of the local symbols of +.meta src-package +and rehomes each symbol into +.metn dst-package . +Then, it deletes +.metn src-package . + +Note: the local symbols are identified as if using +.codn package-local-symbols , +rehoming is performed as if using +.codn rehome-sym , +and deleting +.meta src-package +is performed as if using +.codn delete-package . + .coNP Function @ packagep .synb .mets (packagep << obj ) |