diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-02-28 23:15:10 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-02-28 23:15:10 -0800 |
commit | 94750af472e12acf3a5970c98e4dab6feada2e84 (patch) | |
tree | 0f91686515e864ea184cc866c980ddc979783b0c /genvim.txr | |
parent | 8c634953700bdf3199b68e8ccf2eff4132ca81d5 (diff) | |
download | txr-94750af472e12acf3a5970c98e4dab6feada2e84.tar.gz txr-94750af472e12acf3a5970c98e4dab6feada2e84.tar.bz2 txr-94750af472e12acf3a5970c98e4dab6feada2e84.zip |
Change in the design of how special variables work, to fix the broken
re-binding. C code now has to go through the dynamic environment lookup
to access things like *random-state*, or *stdout*. As part of this,
I'm moving some intrinsic variable and function initializations out of
eval.c and into their respective modules. Macros are are used to make
global variables look like ordinary C variables. This is very similar
to the errno trick in POSIX threads implementations.
* eval.c (looup_var, lookup_var_l): Restructured to eliminate silly
goto, the cobjp handling is gone.
(reg_fun, reg_var): Internal function becomes external.
reg_var registers a simple cons cell binding now, without any
C pointer tricks to real C global variables.
(c_var_mark): Static function removed.
(c_var_ops): Static struct removed.
(eval_init): Numerous initializations for streams, syslog, rand,
signals and others moved to their respective modules.
The new symbol variables user_package_s, keyword_package_s
and system_package_s are interned here, and the variables are
created in a special way.
* eval.h (reg_var, reg_fun): Declared.
* gc.c (prot1): Added assert that the loc pointer isn't null.
This happened, and blew up during garbage collection.
* lib.c (system_package, keyword_package, user_package): Variables
removed these become macros.
(system_package_var, keyword_package_var, user_package_var): New
global variables.
(system_package_s, keyword_package_s, user_package_s): New
symbol globals.
(get_user_package, get_system_package, get_keyword_package): New
functions.
(obj_init): Protect new variables. Initialization order of modules
tweaked: the modules sig_init, stream_init, and rand_init are moved
after eval_init because they register variables.
* lib.h (keyword_package, system_pckage, user_package): Variables
turned into macros.
(system_package_var, keyword_package_var, user_package_var): Declared.
(system_package_s, keyword_package_s, user_package_s): Declared.
(get_user_package, get_system_package, get_keyword_package): Declared.
* rand.c (struct random_state): Renamed to struct rand_state to
avoid clash with new random_state macro.
(random_state): Global variable removed.
(random_state_s): New symbol global.
(make_state, rand32, make_random_state, random_fixnum, random):
Follow rename of struct random_state.
Diffstat (limited to 'genvim.txr')
-rw-r--r-- | genvim.txr | 15 |
1 files changed, 6 insertions, 9 deletions
@@ -7,10 +7,9 @@ static void dir_tables_init(void) @(until) } @(end) -@(next "eval.c") -@(skip) -void eval_init(void) -{ +@(next @[apply make-catenated-stream + [mapcar open-file '("eval.c" "rand.c" "signal.c" + "stream.c" "syslog.c" "txr.c")]]) @(collect) @ (cases) reg_@/op|mac/(@{txl-sym-nostar}_star_s,@(skip) @@ -18,17 +17,15 @@ void eval_init(void) @ (or) reg_@/op|mac/(@{txl-sym}_s,@(skip) @ (or) - reg_mac(intern(lit("@{txl-sym}"),@(skip) + reg_mac(intern(lit("@{txl-sym}")@(skip) @ (or) - reg_fun(intern(lit("@{txl-sym}"),@(skip) + reg_fun(intern(lit("@{txl-sym}")@(skip) @ (or) reg_fun(@{txl-sym}_s,@(skip) @ (or) - reg_var(intern(lit("@{txl-sym}"),@(skip) + @/ */reg_var(@(skip)intern(lit("@{txl-sym}")@(skip) @ (end) @ (set txl-sym @(regsub #/_/ #\- txl-sym)) -@(until) -} @(end) @(do (defun sortuniq (list) |