diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-04-18 19:16:10 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-04-18 19:16:10 -0700 |
commit | dfd8eb5a2c6209cfde54d16949e1f0fc570a791a (patch) | |
tree | 32f7dabaf44eafa74dbf32a461dfb0ad1d20f307 /eval.c | |
parent | e21f19001551eddbb8d27acea1327590ce124461 (diff) | |
download | txr-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.c | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -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)); |