summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-08-03 09:59:49 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-08-03 09:59:49 -0700
commit1878f60ebdacdd52fb05a171eb07b4bc91e9704c (patch)
treef794b0600c8a68c5e162f1aae53d5e230bcebd30 /eval.c
parenteb657afe78925f7905bc3ca7093bb5e5f441bf4f (diff)
downloadtxr-1878f60ebdacdd52fb05a171eb07b4bc91e9704c.tar.gz
txr-1878f60ebdacdd52fb05a171eb07b4bc91e9704c.tar.bz2
txr-1878f60ebdacdd52fb05a171eb07b4bc91e9704c.zip
Switching some globals to lexical and changing some names.
* arith.c (arith-init): Changing *flo-...* from special to lexical, and adding un-earmuffed variants. The earmuffed versions are obsolescent. Adding %pi% and %e% global lexicals. Earmuffed versions are also made global lexical, and obsolescent. * eval.c (lookup_global_var, lookup_global_var_l): New functions. (lookup_var): Uses lookup_global_var. (reg_varl): New function. (reg_var): Uses reg_var. (eval_init): Register global lexicals user-package, system-package and keyword-package. Old symbols with earmuffs are obsoleted, and also turned into global lexicals. (top-vb, top-fb): Changed to lexical. * eval.h (lookup_global_var, lookup_global_var_l, reg_varl): Declared. * genvim.txr: Scan ver.tl so that the lib-version variable is included. Extract reg_varl calls. * glob.c (glob_init): glob-err and other variables made lexical. * lib.c (get_user_package, get_system_package, get_keyword_package): Use lookup_global_var_l to avoid searching dynamic scope for lexicals which cannot be dynamically rebound. * share/txr/stdlib/ver.tl (lib-version): New global lexical variable. (*lib-version*): Turned lexical. Obsolescent. * signal.c (sig-init): sig-* variables turned lexical. * sysif.c (sysif-init): s-*, poll-* and w-* variables turned lexical. * syslog.c (syslog-init): log-* variables turned lexical. * txr.c (sysroot-init): stdlib and *txr-version* variables turned lexical. txr-version variable added, and *txr-version* is obsolescent. (txr-main): self-path variable added. *self-path* turns lexical and is obsolescent. * txr.1: Documentation updated. Lexical variables not referred to as special. Special variables referred to as special.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/eval.c b/eval.c
index fa2f4c73..bfe7ade2 100644
--- a/eval.c
+++ b/eval.c
@@ -168,10 +168,15 @@ noreturn static val eval_error(val form, val fmt, ...)
abort();
}
-val lookup_var(val env, val sym)
+val lookup_global_var(val sym)
{
uses_or2;
+ return or2(gethash(top_vb, sym),
+ if2(lisplib_try_load(sym), gethash(top_vb, sym)));
+}
+val lookup_var(val env, val sym)
+{
if (env) {
type_check(env, ENV);
@@ -188,8 +193,7 @@ val lookup_var(val env, val sym)
return binding;
}
- return or2(gethash(top_vb, sym),
- if2(lisplib_try_load(sym), gethash(top_vb, sym)));
+ return lookup_global_var(sym);
}
static val lookup_sym_lisp1(val env, val sym)
@@ -226,6 +230,12 @@ loc lookup_var_l(val env, val sym)
return if3(binding, cdr_l(binding), nulloc);
}
+loc lookup_global_var_l(val sym)
+{
+ val binding = lookup_global_var(sym);
+ return if3(binding, cdr_l(binding), nulloc);
+}
+
val lookup_fun(val env, val sym)
{
uses_or2;
@@ -3761,10 +3771,15 @@ static void reg_mac(val sym, mefun_t fun)
sethash(builtin, sym, defmacro_s);
}
-void reg_var(val sym, val val)
+void reg_varl(val sym, val val)
{
assert (sym != nil);
sethash(top_vb, sym, cons(sym, val));
+}
+
+void reg_var(val sym, val val)
+{
+ reg_varl(sym, val);
mark_special(sym);
}
@@ -4406,12 +4421,16 @@ void eval_init(void)
reg_fun(intern(lit("pprinl"), user_package), func_n2o(pprinl, 1));
reg_fun(intern(lit("tprint"), user_package), func_n2o(tprint, 1));
- reg_var(user_package_s = intern(lit("*user-package*"), user_package_var),
- user_package_var);
- reg_var(system_package_s = intern(lit("*system-package*"), user_package_var),
- system_package_var);
- reg_var(keyword_package_s = intern(lit("*keyword-package*"), user_package_var),
- keyword_package_var);
+ reg_varl(user_package_s = intern(lit("user-package"), user_package_var),
+ user_package_var);
+ reg_varl(system_package_s = intern(lit("system-package"), user_package_var),
+ system_package_var);
+ reg_varl(keyword_package_s = intern(lit("keyword-package"), user_package_var),
+ keyword_package_var);
+
+ reg_varl(intern(lit("*user-package*"), user_package), user_package_var);
+ reg_varl(intern(lit("*system-package*"), user_package), system_package_var);
+ reg_varl(intern(lit("*keyword-package*"), user_package), keyword_package_var);
reg_fun(intern(lit("make-sym"), user_package), func_n1(make_sym));
reg_fun(intern(lit("gensym"), user_package), func_n1o(gensym, 0));
@@ -4555,8 +4574,8 @@ void eval_init(void)
reg_fun(intern(lit("make-like"), user_package), func_n2(make_like));
reg_fun(intern(lit("nullify"), user_package), func_n1(nullify));
- reg_var(intern(lit("top-vb"), system_package), top_vb);
- reg_var(intern(lit("top-fb"), system_package), top_fb);
+ reg_varl(intern(lit("top-vb"), system_package), top_vb);
+ reg_varl(intern(lit("top-fb"), system_package), top_fb);
reg_fun(intern(lit("symbol-value"), user_package), func_n1(symbol_value));
reg_fun(intern(lit("symbol-function"), user_package), func_n1(symbol_function));
reg_fun(intern(lit("boundp"), user_package), func_n1(boundp));