diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-01-06 14:30:18 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-01-06 14:30:18 -0800 |
commit | 7efce88113302cae30a6c0af4319b80882abb7db (patch) | |
tree | 2bc4379d742768b8f4dbb70b249a76622ec50735 | |
parent | ad54f9d10165be47b34e6e09d009d115e3808f49 (diff) | |
download | txr-7efce88113302cae30a6c0af4319b80882abb7db.tar.gz txr-7efce88113302cae30a6c0af4319b80882abb7db.tar.bz2 txr-7efce88113302cae30a6c0af4319b80882abb7db.zip |
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.
-rw-r--r-- | eval.c | 16 | ||||
-rw-r--r-- | txr.1 | 17 |
2 files changed, 30 insertions, 3 deletions
@@ -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); } @@ -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, |