summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-09-03 07:01:03 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-09-03 07:01:03 -0700
commitc8d5fd566e7acc5ed3f42d210d4f494efde0772b (patch)
tree51d85fd5cce309b9ca7fe14eb75a5a45821c4ede /eval.c
parent6cf10bb9919aa27735f7d13539aaa871400777e4 (diff)
downloadtxr-c8d5fd566e7acc5ed3f42d210d4f494efde0772b.tar.gz
txr-c8d5fd566e7acc5ed3f42d210d4f494efde0772b.tar.bz2
txr-c8d5fd566e7acc5ed3f42d210d4f494efde0772b.zip
load: new macros push-after-load and pop-after-load.
* eval.c (me_push_after_load, me_pop_after_load): New static functions. (eval_init): Register push-after-load and pop-after-load intrinsic macros. * tests/019/load-hook.tl: Tests for correct expansion. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index 006861b1..487df9d7 100644
--- a/eval.c
+++ b/eval.c
@@ -4579,6 +4579,25 @@ static val me_load_for(val form, val menv)
return cons(rt_load_for_s, out);
}
+static val me_push_after_load(val form, val menv)
+{
+ (void) menv;
+ return list(set_s,
+ load_hooks_s,
+ list(cons_s,
+ cons(lambda_s, cons(nil, cdr(form))),
+ load_hooks_s,
+ nao), nao);
+}
+
+static val me_pop_after_load(val form, val menv)
+{
+ (void) menv;
+ if (cdr(form))
+ expand_error(form, lit("~s: no arguments required"), car(form), nao);
+ return list(set_s, load_hooks_s, list(cdr_s, load_hooks_s, nao), nao);
+}
+
void run_load_hooks(val load_dyn_env)
{
val hooks_binding = lookup_var(load_dyn_env, load_hooks_s);
@@ -6808,6 +6827,10 @@ void eval_init(void)
reg_mac(intern(lit("mlet"), user_package), func_n2(me_mlet));
reg_mac(load_time_s, func_n2(me_load_time));
reg_mac(intern(lit("load-for"), user_package), func_n2(me_load_for));
+ reg_mac(intern(lit("push-after-load"), user_package),
+ func_n2(me_push_after_load));
+ reg_mac(intern(lit("pop-after-load"), user_package),
+ func_n2(me_pop_after_load));
reg_mac(intern(lit("assert"), user_package), func_n2(me_assert));
reg_fun(cons_s, func_n2(cons));