Detecting arity errors
Lassi Kortela
(15 Apr 2020 07:48 UTC)
|
Re: Detecting arity errors
Marc Nieper-Wißkirchen
(15 Apr 2020 08:49 UTC)
|
Re: Detecting arity errors
Lassi Kortela
(15 Apr 2020 09:19 UTC)
|
Re: Detecting arity errors
Marc Nieper-Wißkirchen
(15 Apr 2020 09:43 UTC)
|
Re: Detecting arity errors
Lassi Kortela
(15 Apr 2020 09:51 UTC)
|
Re: Detecting arity errors
Marc Nieper-Wißkirchen
(15 Apr 2020 10:34 UTC)
|
Re: Detecting arity errors Lassi Kortela (15 Apr 2020 10:54 UTC)
|
Re: Detecting arity errors
Lassi Kortela
(15 Apr 2020 10:57 UTC)
|
Re: Detecting arity errors
Marc Nieper-Wißkirchen
(15 Apr 2020 11:17 UTC)
|
Re: Detecting arity errors
Lassi Kortela
(15 Apr 2020 16:39 UTC)
|
> It doesn't distinguish arity errors from other kinds of errors. An > `arity-error?` predicate could be plugged into `test-error` (if its > `error-type` argument is extended to allow predicate procedures, which > seems reasonable and permitted by the SRFI 64 definition). > > I don't see how `arity-error?' will work reliably here. Consider the > following definition: > > (define (member x x* . =?*) > (let ((=? (cond ((null? =?*) equal?) > ((null? (cdr =?*)) (car =?*)) > (else (error "member: arity error: two many arguments > given"))))) > (let f ((x* x*)) (and (not (null? x*)) (if (=? x (car x*)) x* (f > (cdr x*))))))) > > A test like `(test-error arity-error? (member 'a '(b c d) eq? 'junk))' > will fail. No test is perfect. It would be a useful safeguard against obvious mistakes that have practical consequences. No matter how well we write tests, it's not possible to catch every problem or avoid all ambiguities. > A related problem is with an implementation like the following one when > it is used in Schemes that macro-expand `case-lambda' into `lambda': > > (define member > (case-lambda > ((x x*) (member x x* equal?)) > ((x x* =?) ...))) That case also cannot be helped. Another example is, an arity error when calling `foo` does not necessarily come from passing an incorrect number of args to `foo`. It could also come from `foo` internally passing incorrect args to some helper procedure. Or the outer call to `foo` has correct args but `foo` calls itself recursively with incorrect args, etc. If we wanted to handle all nuances like this, the tests would probably become so verbose that no-one would want to write them. I stand by my claim that such tests are useful in many situations even if not perfect, or not applicable to all situations. A useful `arity-error?` also ought to be fairly easy to define. (When in doubt, just return #f.)