summaryrefslogtreecommitdiffstats
path: root/genvim.txr
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-02-28 23:15:10 -0800
committerKaz Kylheku <kaz@kylheku.com>2014-02-28 23:15:10 -0800
commit94750af472e12acf3a5970c98e4dab6feada2e84 (patch)
tree0f91686515e864ea184cc866c980ddc979783b0c /genvim.txr
parent8c634953700bdf3199b68e8ccf2eff4132ca81d5 (diff)
downloadtxr-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.txr15
1 files changed, 6 insertions, 9 deletions
diff --git a/genvim.txr b/genvim.txr
index c3565859..114c40f1 100644
--- a/genvim.txr
+++ b/genvim.txr
@@ -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)