summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index 429d9352..1089c6b8 100644
--- a/eval.c
+++ b/eval.c
@@ -273,6 +273,40 @@ static val lookup_symac(val menv, val sym)
}
}
+static val lexical_var_p(val menv, val sym)
+{
+ if (nilp(menv)) {
+ return nil;
+ } else {
+ type_check(menv, ENV);
+
+ {
+ val binding = assoc(sym, menv->e.vbindings);
+
+ if (binding) /* special_s: see make_var_shadowing_env */
+ return c_true(cdr(binding) == special_s);
+ return lexical_var_p(menv->e.up_env, sym);
+ }
+ }
+}
+
+static val lexical_fun_p(val menv, val sym)
+{
+ if (nilp(menv)) {
+ return nil;
+ } else {
+ type_check(menv, ENV);
+
+ {
+ val binding = assoc(sym, menv->e.fbindings);
+
+ if (binding) /* special_s: see make_var_shadowing_env */
+ return c_true(cdr(binding) == special_s);
+ return lexical_fun_p(menv->e.up_env, sym);
+ }
+ }
+}
+
static void mark_special(val sym)
{
sethash(special, sym, t);
@@ -3815,6 +3849,8 @@ void eval_init(void)
reg_fun(intern(lit("make-env"), user_package), func_n3o(make_env_intrinsic, 0));
reg_fun(intern(lit("env-fbind"), user_package), func_n3(env_fbind));
reg_fun(intern(lit("env-vbind"), user_package), func_n3(env_vbind));
+ reg_fun(intern(lit("lexical-var-p"), user_package), func_n2(lexical_var_p));
+ reg_fun(intern(lit("lexical-fun-p"), user_package), func_n2(lexical_fun_p));
reg_fun(chain_s, func_n0v(chainv));
reg_fun(chand_s, func_n0v(chandv));
reg_fun(intern(lit("juxt"), user_package), func_n0v(juxtv));