diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-12-29 13:12:42 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-12-29 13:12:42 -0800 |
commit | 2af0204512def6801b49faa432db351a7adaac6d (patch) | |
tree | ba46ad87f705c9922c5993d56462f3fc395a6045 | |
parent | 744340ab8015179bd32d523e46ed2f56f20c82b9 (diff) | |
download | txr-2af0204512def6801b49faa432db351a7adaac6d.tar.gz txr-2af0204512def6801b49faa432db351a7adaac6d.tar.bz2 txr-2af0204512def6801b49faa432db351a7adaac6d.zip |
Bugfix: optarg presence indicators may be specials.
This fixes the incorrect treatment of the x-p parameter in
(lambda (: (x form x-p))) when x-p is a special variable.
It is being lexically bound.
* eval.c (expand_opt_params_rec): When processing a (var
initform) pair, check for (var initform sym). Error out if
sym is not bindable. Check if it is special and if so,
push it into the list of specials.
-rw-r--r-- | eval.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -806,6 +806,13 @@ static val expand_opt_params_rec(val params, val menv, not_bindable_error(form, sym); if (special_var_p(sym)) push(sym, pspecials); + if (cddr(pair)) { + val opt_sym = caddr(pair); + if (!bindable(opt_sym)) + not_bindable_error(form, opt_sym); + if (special_var_p(opt_sym)) + push(opt_sym, pspecials); + } return rlcp(cons(form_ex, expand_opt_params_rec(rest(params), menv, form, pspecials)), cdr(params)); |