summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-08-19 07:12:24 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-08-19 07:12:24 -0700
commitfc44a670c11fb653b3600327082eeb8df8b82563 (patch)
tree97a04b679704c75bbabb1b37cdd52258cd732b6c /lib.c
parentc38f93bc7f763ae776c7e68de120faea169d7f05 (diff)
downloadtxr-fc44a670c11fb653b3600327082eeb8df8b82563.tar.gz
txr-fc44a670c11fb653b3600327082eeb8df8b82563.tar.bz2
txr-fc44a670c11fb653b3600327082eeb8df8b82563.zip
new functions: find-symbol and find-symbol-fb.
Turns out, there is already a find_symbol in lib.c, completely unused. * eval.c (eval_init): Register find-symbol and find-symbol-fb intrinsics. * lib.c (find_symbol): Fix this hitherto unused function to do correct defaulting of the package argument and, to accept an additional argument specifying the not-found value. (find_symbol_fb): New function. * lib.c (find_symbol): Declaration updated. (find_symbol_fb): Declared. * txr.1: Documented.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c57
1 files changed, 49 insertions, 8 deletions
diff --git a/lib.c b/lib.c
index 5a99d1b0..e2683245 100644
--- a/lib.c
+++ b/lib.c
@@ -5337,19 +5337,60 @@ val symbol_needs_prefix(val self, val package, val sym)
return sym_pkg->pk.name;
}
-val find_symbol(val str, val package_in)
+val find_symbol(val name, val package_in, val notfound_val_in)
{
val self = lit("find-symbol");
- val package = get_package(self, package_in, nil);
- val found;
+ val package = get_package(self, package_in, t);
- if (!stringp(str))
- uw_throwf(error_s, lit("~a: name ~s isn't a string"), self, str, nao);
+ if (!stringp(name))
+ uw_throwf(error_s, lit("~a: name ~s isn't a string"), self, name, nao);
+
+ {
+ val cell = gethash_e(self, package->pk.symhash, name);
+ if (cell)
+ return cdr(cell);
+ }
+
+ {
+ val fallback = get_hash_userdata(package->pk.symhash);
+
+ for (; fallback; fallback = cdr(fallback)) {
+ val fb_pkg = car(fallback);
+ val cell = gethash_e(self, fb_pkg->pk.symhash, name);
+ if (cell)
+ return cdr(cell);
+ }
+ }
- if ((found = gethash_e(self, package->pk.symhash, str)))
- return cdr(found);
+ return default_null_arg(notfound_val_in);
+}
+
+val find_symbol_fb(val name, val package_in, val notfound_val_in)
+{
+ val self = lit("find-symbol-fb");
+ val package = get_package(self, package_in, t);
+
+ if (!stringp(name))
+ uw_throwf(error_s, lit("~a: name ~s isn't a string"), self, name, nao);
+
+ {
+ val cell = gethash_e(self, package->pk.symhash, name);
+ if (cell)
+ return cdr(cell);
+ }
+
+ {
+ val fallback = get_hash_userdata(package->pk.symhash);
+
+ for (; fallback; fallback = cdr(fallback)) {
+ val fb_pkg = car(fallback);
+ val cell = gethash_e(self, fb_pkg->pk.symhash, name);
+ if (cell)
+ return cdr(cell);
+ }
+ }
- return zero;
+ return default_null_arg(notfound_val_in);
}
val intern(val str, val package_in)