From 129b1323a6d30e219dbd2f59413da084924e73c7 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 6 Jan 2017 14:30:18 -0800 Subject: Allow last var to be omitted in whilet. * eval.c (me_whilet): insert gensym if last var is missing. Warn if init-form looks like a variable. * txr.1: Documented by copy and paste from iflet. --- eval.c | 16 +++++++++++++--- txr.1 | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/eval.c b/eval.c index c5151391..319faa5b 100644 --- a/eval.c +++ b/eval.c @@ -3466,16 +3466,26 @@ static val me_whilet(val form, val env) val body = form; val sym = pop(&body); val lets = pop(&body); - val lastlet = last(lets, nil); + val lastlet_cons = last(lets, nil); + val lastlet = car(lastlet_cons); val not_done = gensym(lit("not-done")); - if (nilp(lastlet)) + if (nilp(lastlet_cons)) eval_error(form, lit("~s: empty binding list"), sym, nao); + if (!cdr(lastlet)) { + val var = car(lastlet); + if (symbolp(var) && bindable(var)) + eval_warn(form, lit("~s: ~s is init-form here, not new variable"), + sym, var, nao); + push(gensym(nil), &lastlet); + lets = append2(butlast(lets, nil), cons(lastlet, nil)); + } + return list(let_s, cons(list(not_done, t, nao), nil), list(while_s, not_done, list(let_star_s, lets, - list(if_s, car(car(lastlet)), + list(if_s, car(lastlet), cons(progn_s, body), list(set_s, not_done, nil, nao), nao), nao), nao), nao); } diff --git a/txr.1 b/txr.1 index e1ef3748..0ef550de 100644 --- a/txr.1 +++ b/txr.1 @@ -13757,6 +13757,23 @@ loop is thus terminated by an explicit a return value can be specified. Under normal termination, the return value is .codn nil . +In the syntax, a small convenience is permitted. Instead of the last +.cblk +.meti >> ( sym << init-form ) +.cble +it is permissible for the syntax +.cblk +.meti <> ( init-form ) +.cble +to appear, the +.meta sym +being omitted. A machine-generated variable is substituted +in place of the missing +.meta sym +and that variable is then initialized from +.meta init-form +and used as the basis of the test. + .TP* Examples: .cblk ;; read lines of text from *std-input* and print them, -- cgit v1.2.3