summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-08-10 19:25:36 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-08-10 19:25:36 -0700
commitf8bca2bc1e7bdb6fde4e61f92fa7b8e6f2295474 (patch)
treee9b5236aa162504a8701c7452938099996bcbe85 /lib.c
parent174c054bbc54aefa4068d2863b43fabd9914ebd2 (diff)
downloadtxr-f8bca2bc1e7bdb6fde4e61f92fa7b8e6f2295474.tar.gz
txr-f8bca2bc1e7bdb6fde4e61f92fa7b8e6f2295474.tar.bz2
txr-f8bca2bc1e7bdb6fde4e61f92fa7b8e6f2295474.zip
New feature: local symbol renaming.
The new function use-sym-as can bring a foreign symbol into a package under a different name, which is not that symbol's name. This is also featured in a new defpackage clause, :use-syms-as. With this simple relaxation in the package system, we don't require package local nicknames, which is more complicated to implement and less ergonomic, because it doesn't actually vanquish the use of ugly package prefixes on clashing symbols. * eval.c (eval_init): Register use-syms-as. * lib.c (use_sym_as): New function, made out of use_sym. (use_sym): Now a wrapper for use_sym_as. * lib.h (use_sym_as): Declared. * stdlib/package.tl (defpackage): Implement :use-syms-as clause. * tests/012/use-as.tl: New file. * txr.1: Documented, * stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/lib.c b/lib.c
index 1ce03dc2..d7a7ce66 100644
--- a/lib.c
+++ b/lib.c
@@ -7314,13 +7314,19 @@ static void prot_sym_check(val func, val symname, val package)
}
}
-val use_sym(val symbol, val package_in)
+val use_sym_as(val symbol, val name, val package_in)
{
- val self = lit("use-sym");
+ val self = lit("use-sym-as");
val package = get_package(self, package_in, t);
+ if (symbolp(name))
+ name = symbol_name(name);
+ else if (!stringp(name))
+ uw_throwf(error_s,
+ lit("~a: ~s: name must be specified as string or symbol"),
+ self, name, nao);
+
if (symbol_package(symbol) != package) {
- val name = symbol_name(symbol);
val found = gethash_e(self, package->pk.symhash, name);
val existing = cdr(found);
@@ -7338,6 +7344,11 @@ val use_sym(val symbol, val package_in)
return symbol;
}
+val use_sym(val sym, val package_in)
+{
+ return use_sym_as(sym, symbol_name(sym), package_in);
+}
+
val unuse_sym(val symbol, val package_in)
{
val self = lit("unuse-sym");