diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-08-19 07:12:24 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-08-19 07:12:24 -0700 |
commit | fc44a670c11fb653b3600327082eeb8df8b82563 (patch) | |
tree | 97a04b679704c75bbabb1b37cdd52258cd732b6c /lib.c | |
parent | c38f93bc7f763ae776c7e68de120faea169d7f05 (diff) | |
download | txr-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.c | 57 |
1 files changed, 49 insertions, 8 deletions
@@ -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) |