From 439e35da61ed06da34d62cc5170547221e6f4563 Mon Sep 17 00:00:00 2001 From: Kris Katterjohn Date: Wed, 28 Mar 2018 21:11:33 -0500 Subject: [PATCH] Check for valid "rest" parameters in parameter lists Checks for invalid parameter names and duplicate parameters were being performed on parameter lists, but these checks were not considering any rest parameters. This means that ((lambda (x . x) x) 'foo 'bar) => foo ((lambda (x . 0) x) 'foo 'bar) => foo ((lambda (x . #t) x) 'foo 'bar) => foo ((lambda 0 'foo)) => foo ((lambda #t 'foo)) => foo and so on. Now these all produce errors. --- eval.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/eval.c b/eval.c index 6d6fccca..5db590c1 100644 --- a/eval.c +++ b/eval.c @@ -806,6 +806,12 @@ static sexp analyze_lambda (sexp ctx, sexp x, int depth) { sexp_return(res, sexp_compile_error(ctx, "non-symbol parameter", x)); else if (sexp_truep(sexp_memq(ctx, sexp_car(ls), sexp_cdr(ls)))) sexp_return(res, sexp_compile_error(ctx, "duplicate parameter", x)); + if (! sexp_nullp(ls)) { + if (! sexp_idp(ls)) + sexp_return(res, sexp_compile_error(ctx, "non-symbol parameter", x)); + else if (sexp_truep(sexp_memq(ctx, ls, sexp_cadr(x)))) + sexp_return(res, sexp_compile_error(ctx, "duplicate parameter", x)); + } /* build lambda and analyze body */ res = sexp_make_lambda(ctx, tmp=sexp_copy_list(ctx, sexp_cadr(x))); if (sexp_exceptionp(res)) sexp_return(res, res);