From 226a56a3d454b18b2b57c4489fdb8efbf4cd8332 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Sat, 6 Oct 2012 06:04:29 -0400 Subject: [PATCH] Improve error reporting in 'append!' * libguile/list.c (scm_append_x): Report correct argument number when validating arguments. Validate that the last cdr of each argument is null or nil. Rename formal rest argument from 'lists' to 'args'. * test-suite/tests/list.test (append!): Update tests to expect correct handling of improper lists. --- libguile/list.c | 17 ++++++++++------- test-suite/tests/list.test | 6 +++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/libguile/list.c b/libguile/list.c index 221ee79d0..6c8f8bef2 100644 --- a/libguile/list.c +++ b/libguile/list.c @@ -267,7 +267,7 @@ SCM_DEFINE (scm_append, "append", 0, 0, 1, SCM_DEFINE (scm_append_x, "append!", 0, 0, 1, - (SCM lists), + (SCM args), "A destructive version of @code{append} (@pxref{Pairs and\n" "Lists,,,r5rs, The Revised^5 Report on Scheme}). The cdr field\n" "of each list's final pair is changed to point to the head of\n" @@ -276,26 +276,29 @@ SCM_DEFINE (scm_append_x, "append!", 0, 0, 1, #define FUNC_NAME s_scm_append_x { SCM ret, *loc; - SCM_VALIDATE_REST_ARGUMENT (lists); + int argnum = 1; + SCM_VALIDATE_REST_ARGUMENT (args); - if (scm_is_null (lists)) + if (scm_is_null (args)) return SCM_EOL; loc = &ret; for (;;) { - SCM arg = SCM_CAR (lists); + SCM arg = SCM_CAR (args); *loc = arg; - lists = SCM_CDR (lists); - if (scm_is_null (lists)) + args = SCM_CDR (args); + if (scm_is_null (args)) return ret; if (!SCM_NULL_OR_NIL_P (arg)) { - SCM_VALIDATE_CONS (SCM_ARG1, arg); + SCM_VALIDATE_CONS (argnum, arg); loc = SCM_CDRLOC (scm_last_pair (arg)); + SCM_VALIDATE_NULL_OR_NIL (argnum, *loc); } + argnum++; } } #undef FUNC_NAME diff --git a/test-suite/tests/list.test b/test-suite/tests/list.test index dc06f0795..ff31c8605 100644 --- a/test-suite/tests/list.test +++ b/test-suite/tests/list.test @@ -439,15 +439,15 @@ (with-test-prefix "wrong argument" - (expect-fail-exception "improper list and empty list" + (pass-if-exception "improper list and empty list" exception:wrong-type-arg (append! (cons 1 2) '())) - (expect-fail-exception "improper list and list" + (pass-if-exception "improper list and list" exception:wrong-type-arg (append! (cons 1 2) (list 3 4))) - (expect-fail-exception "list, improper list and list" + (pass-if-exception "list, improper list and list" exception:wrong-type-arg (append! (list 1 2) (cons 3 4) (list 5 6)))