summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2013-05-14 19:23:13 -0700
committerKaz Kylheku <kaz@kylheku.com>2013-05-14 19:23:13 -0700
commitaced8689f932eeb2a0042a7b89ce4485e3be9c04 (patch)
tree3832f8184fcef6e6743a24c95a6bc676f71a28c3 /lib.c
parentdb10f6c3b7270e033563744974bd5979fc33b014 (diff)
downloadtxr-aced8689f932eeb2a0042a7b89ce4485e3be9c04.tar.gz
txr-aced8689f932eeb2a0042a7b89ce4485e3be9c04.tar.bz2
txr-aced8689f932eeb2a0042a7b89ce4485e3be9c04.zip
* RELNOTES: Updated in preparation for release.
* eval.c (eval_init): Expose delete-package, rehome-sym and packagep. * lib.c (make_package, intern): use ~s formatting for package name in error message. (packagep, delete_package, rehome_sym): New functions. * lib.h (packagep, delete_package, rehome_sym): Declared. * txr.1: Documented process functions and packages.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/lib.c b/lib.c
index dfc1e75d..2d9fa99a 100644
--- a/lib.c
+++ b/lib.c
@@ -2360,7 +2360,7 @@ val gensymv(val args)
val make_package(val name)
{
if (find_package(name)) {
- uw_throwf(error_s, lit("make_package: ~a exists already"), name, nao);
+ uw_throwf(error_s, lit("make_package: ~s exists already"), name, nao);
} else {
val obj = make_obj();
obj->pk.type = PKG;
@@ -2372,11 +2372,29 @@ val make_package(val name)
}
}
+val packagep(val obj)
+{
+ return type(obj) == PKG ? t : nil;
+}
+
val find_package(val name)
{
return cdr(assoc(name, packages));
}
+val delete_package(val package)
+{
+ if (stringp(package)) {
+ package = find_package(package);
+ if (!package)
+ uw_throwf(error_s, lit("delete-package: no such package: ~s"), package, nao);
+ }
+
+ type_check (package, PKG);
+ packages = alist_nremove(packages, package->pk.name);
+ return nil;
+}
+
val intern(val str, val package)
{
val new_p;
@@ -2387,7 +2405,7 @@ val intern(val str, val package)
} else if (stringp(package)) {
package = find_package(str);
if (!package)
- uw_throwf(error_s, lit("make_package: ~a exists already"), str, nao);
+ uw_throwf(error_s, lit("intern: symbol ~s exists already"), str, nao);
}
type_check (package, PKG);
@@ -2403,10 +2421,20 @@ val intern(val str, val package)
}
}
-static val rehome_sym(val sym, val package)
+val rehome_sym(val sym, val package)
{
if (!sym)
return nil;
+
+ if (nullp(package)) {
+ package = user_package;
+ } else if (stringp(package)) {
+ val p = find_package(package);
+ if (!p)
+ uw_throwf(error_s, lit("rehome-sym: no such package: ~s"), package, nao);
+ package = p;
+ }
+
type_check (package, PKG);
type_check (sym, SYM);