diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-11-08 21:09:45 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-11-08 21:09:45 -0800 |
commit | 847a7b6c5292bd2126303e3ab7a6916657e13a71 (patch) | |
tree | 35e76797d42dbdae9171ab436f492e754576cf78 /lib.h | |
parent | 3ccdd5c9bfc6c8a8812ef6dab12dc1a1cd2bc0ee (diff) | |
download | txr-847a7b6c5292bd2126303e3ab7a6916657e13a71.tar.gz txr-847a7b6c5292bd2126303e3ab7a6916657e13a71.tar.bz2 txr-847a7b6c5292bd2126303e3ab7a6916657e13a71.zip |
Implement *package* special var; package overhaul.
* eval.c (load): Rebind *package* in the local dynamic
environment already established for the sake of *load-path*.
By doing this we cause *package* to be restored to its
prior value, which allows the loaded file to alter it.
Common Lisp works this way.
(eval_init): Register *package* variable, with the
user package as its default value.
* lib.c (package_s): New symbol variable.
(intern, rehome_sym): Default the package argument to the
current package, not to user_package.
(get_user_package, get_system_package, get_keyword_package):
Functions removed.
(get_current_package): New function.
(obj_print_impl): Revise symbol printing. Keyword and
uninterned symbols are printed with : and #: prefixes.
The remainder are printed with a package prefix if their
home package isn't the current package.
* lib.h (keyword_package, user_package, system_package): These
macros are just straight aliases for the global
variables, not going through the lookup mechanism,
which was pointless.
(cur_package): New macro.
(package_s): Declared.
(get_current_package): Declared.
* lisplib.c (lisplib_try_load): Establish a local
dynamic environment, and bind the *package* variable
to the user package which the library modules expect.
* parser.c (find_matching_syms, provide_completions):
Treat unqualified symbols in the current package
rather than user package.
* parser.y (sym_helper): Intern unqualified symbols
in the current package, not user package.
* txr.1: Document that the variables user-package,
system-package and keyword-package should not be modified.
Document the *package* special variable, and that intern and
rehome-sym default their package argument to its value. (Here
we get rid of wrong references to the undocumented variable
*user-package*).
Diffstat (limited to 'lib.h')
-rw-r--r-- | lib.h | 13 |
1 files changed, 6 insertions, 7 deletions
@@ -412,12 +412,13 @@ INLINE val chr(wchar_t ch) #define lit(strlit) lit_noex(strlit) -#define keyword_package (deref(get_keyword_package())) -#define user_package (deref(get_user_package())) -#define system_package (deref(get_system_package())) +#define keyword_package keyword_package_var +#define user_package user_package_var +#define system_package system_package_var +#define cur_package (get_current_package()) extern val system_package_var, keyword_package_var, user_package_var; -extern val keyword_package_s, system_package_s, user_package_s; +extern val package_s, keyword_package_s, system_package_s, user_package_s; extern val null_s, t, cons_s, str_s, chr_s, fixnum_sl; extern val sym_s, pkg_s, fun_s, vec_s; extern val stream_s, hash_s, hash_iter_s, lcons_s, lstr_s, cobj_s, cptr_s; @@ -788,9 +789,7 @@ val symbolp(val sym); val symbol_name(val sym); val symbol_package(val sym); val keywordp(val sym); -loc get_user_package(void); -loc get_system_package(void); -loc get_keyword_package(void); +val get_current_package(void); val func_f0(val, val (*fun)(val env)); val func_f1(val, val (*fun)(val env, val)); val func_f2(val, val (*fun)(val env, val, val)); |