diff options
-rw-r--r-- | eval.c | 1 | ||||
-rw-r--r-- | lib.c | 26 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | share/txr/stdlib/compiler.tl | 7 |
4 files changed, 23 insertions, 12 deletions
@@ -6580,6 +6580,7 @@ void eval_init(void) reg_var(package_s = intern(lit("*package*"), user_package), (opt_compat && opt_compat <= 190) ? user_package : public_package); reg_fun(intern(lit("make-package"), user_package), func_n1(make_package)); + 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("package-alist"), user_package), func_n0(package_alist)); @@ -5145,6 +5145,18 @@ val gensym(val prefix) return make_sym(name); } +static val make_package_common(val name) +{ + val obj = make_obj(); + obj->pk.type = PKG; + obj->pk.name = name; + obj->pk.symhash = nil; /* make_hash calls below could trigger gc! */ + obj->pk.hidhash = nil; + obj->pk.symhash = make_hash(nil, nil, lit("t")); /* don't have t yet! */ + obj->pk.hidhash = make_hash(nil, nil, lit("t")); + return obj; +} + val make_package(val name) { if (find_package(name)) { @@ -5155,19 +5167,17 @@ val make_package(val name) uw_throwf(error_s, lit("make-package: package name can't be empty string"), nao); } else { - val obj = make_obj(); - obj->pk.type = PKG; - obj->pk.name = name; - obj->pk.symhash = nil; /* make_hash calls below could trigger gc! */ - obj->pk.hidhash = nil; - obj->pk.symhash = make_hash(nil, nil, lit("t")); /* don't have t yet! */ - obj->pk.hidhash = make_hash(nil, nil, lit("t")); - + val obj = make_package_common(name); mpush(cons(name, obj), cur_package_alist_loc); return obj; } } +val make_anon_package(void) +{ + return make_package_common(lit("#<anon-package>")); +} + val packagep(val obj) { return type(obj) == PKG ? t : nil; @@ -830,6 +830,7 @@ val break_str(val str, val set); val make_sym(val name); val gensym(val prefix); val make_package(val name); +val make_anon_package(void); val packagep(val obj); val find_package(val name); val delete_package(val package); diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index ea9b932d..572cb396 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -1559,10 +1559,9 @@ ((neq obj err-ret))) (compile-form (sys:expand* obj))) (let ((*print-circle* t) - (*package* (make-package "$"))) - (unwind-protect - (prinl out.(get) out-stream) - (delete-package *package*)))) + (*package* (sys:make-anon-package))) + (prinl out.(get) out-stream) + (delete-package *package*))) (let ((parser (sys:get-parser in-stream))) (when (> (sys:parser-errors parser) 0) |