summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index e10a0057..e8eaa5a7 100644
--- a/eval.c
+++ b/eval.c
@@ -2856,6 +2856,22 @@ static val me_dotimes(val form, val env)
return apply_frob_args(raw);
}
+static val me_lcons(val form, val menv)
+{
+ val car_form = second(form);
+ val cdr_form = third(form);
+ val lc_sym = gensym(lit("lcons-"));
+ val make_lazy_cons = intern(lit("make-lazy-cons"), user_package);
+ val rplaca = intern(lit("rplaca"), user_package);
+ val rplacd = intern(lit("rplacd"), user_package);
+ (void) menv;
+
+ return list(make_lazy_cons,
+ list(lambda_s, cons(lc_sym, nil),
+ list(rplaca, lc_sym, car_form, nao),
+ list(rplacd, lc_sym, cdr_form, nao), nao), nao);
+}
+
static val expand_catch_clause(val form, val menv)
{
val sym = first(form);
@@ -3997,6 +4013,7 @@ void eval_init(void)
reg_mac(iflet_s, me_iflet_whenlet);
reg_mac(intern(lit("whenlet"), user_package), me_iflet_whenlet);
reg_mac(intern(lit("dotimes"), user_package), me_dotimes);
+ reg_mac(intern(lit("lcons"), user_package), me_lcons);
reg_fun(cons_s, func_n2(cons));
reg_fun(intern(lit("make-lazy-cons"), user_package), func_n1(make_lazy_cons));