summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-04-18 19:16:10 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-04-18 19:16:10 -0700
commitdfd8eb5a2c6209cfde54d16949e1f0fc570a791a (patch)
tree32f7dabaf44eafa74dbf32a461dfb0ad1d20f307 /eval.c
parente21f19001551eddbb8d27acea1327590ce124461 (diff)
downloadtxr-dfd8eb5a2c6209cfde54d16949e1f0fc570a791a.tar.gz
txr-dfd8eb5a2c6209cfde54d16949e1f0fc570a791a.tar.bz2
txr-dfd8eb5a2c6209cfde54d16949e1f0fc570a791a.zip
Adding lcons macro.
* eval.c (me_lcons): New function. (eval_init): Registered lcons macro. * txr.1: Documented lcons. * tl.vim, txr.vim: Regenerated.
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));