diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2023-08-10 19:25:36 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2023-08-10 19:25:36 -0700 |
commit | f8bca2bc1e7bdb6fde4e61f92fa7b8e6f2295474 (patch) | |
tree | e9b5236aa162504a8701c7452938099996bcbe85 /lib.c | |
parent | 174c054bbc54aefa4068d2863b43fabd9914ebd2 (diff) | |
download | txr-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.c | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -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"); |