diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-02-03 10:49:38 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-02-03 10:49:38 -0800 |
commit | 64a5ae81281d7097801e35767fb8518b4a713c5f (patch) | |
tree | 2c4592f70f353625e329c01f1b85445a7b32ea06 | |
parent | 1bfffad44c05952bb43231b231d9bd5e33cf2d57 (diff) | |
download | txr-64a5ae81281d7097801e35767fb8518b4a713c5f.tar.gz txr-64a5ae81281d7097801e35767fb8518b4a713c5f.tar.bz2 txr-64a5ae81281d7097801e35767fb8518b4a713c5f.zip |
Expand sys:setqf separately, with better accuracy.
* eval.c (expand_setqf): New static function.
(do_expand): Handle sys:setqf via new function, which
avoids expanding the symbol, checks that it isn't
a lexical function, and warns about an unbound function.
-rw-r--r-- | eval.c | 26 |
1 files changed, 25 insertions, 1 deletions
@@ -2129,6 +2129,28 @@ static val expand_lisp1_setq(val form, val menv) } } +static val expand_setqf(val form, val menv) +{ + if (!consp(cdr(form)) || !consp(cddr(form)) || cdddr(form)) + eval_error(form, lit("~s: invalid syntax"), car(form), nao); + + { + val op = car(form); + val sym = cadr(form); + val newval = caddr(form); + + if (lexical_fun_p(menv, sym)) + eval_error(form, lit("~s: cannot assign lexical function ~s"), op, sym, nao); + + if (!lookup_fun(nil, sym)) + eval_defr_warn(last_form_expanded, + cons(fun_s, sym), lit("~s: unbound function ~s"), + op, sym, nao); + + return rlcp(cons(op, cons(sym, cons(expand(newval, menv), nil))), form); + } +} + static val op_lisp1_value(val form, val env) { val args = rest(form); @@ -4164,6 +4186,8 @@ static val do_expand(val form, val menv) return expand_lisp1_value(form, menv); } else if (sym == lisp1_setq_s) { return expand_lisp1_setq(form, menv); + } else if (sym == setqf_s) { + return expand_setqf(form, menv); } else if (sym == var_s || sym == expr_s) { return form; } else { @@ -4175,7 +4199,7 @@ static val do_expand(val form, val menv) val args = rest(form_ex); val args_ex = expand_forms(args, menv); - if (sym == setq_s || sym == setqf_s) { + if (sym == setq_s) { if (!args) eval_error(form, lit("~s: missing argument"), sym, nao); |