Re: proposing a simpler mechanism David Van Horn 13 Nov 2009 19:58 UTC

Thomas Bushnell BSG wrote:
> Case-lambda is not a part of standard scheme.

Case-lambda is a part of standard Scheme.

http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-6.html#node_idx_262

> If you mean srfi-16,
> notice the way the reference implementation works.  It defines a
> procedure with a formals list that looks like this:
>
> (lambda args ....)
>
> That would be an arity of "0, #t" in my system.

Yes, and the same information could reported by an implementation of the
current SRFI.  However, the proposal leaves open the possibility of
better arity reporting for case-lambda forms in systems where
case-lambda is treated as a primitive form.

> Indeed, the
>
> Now, the procedure it generates happens to do
>   (error "Wrong number of arguments to CASE-LAMBDA.")
> under various circumstances.
>
> I assume you want to pretend that this error is the "same" as the error
> one gets for calling (lambda (x) ...) with other than exactly one
> argument.  But why?

I do not want to pretend this, so I don't see how to answer your question.

> *Exactly* which errors are the errors referred to by this arity checking
> thing?
>
> If you mean "the parameters in the lambda specification", then
> case-lambda defines procedures with entirely indefinite arity (just look
> at the lambda expressions!).
>
> Alternatively, if you want to insist that case-lambda arities must be
> the "expected" ones for the metaphysical notion of arity, then please
> add to srfi 102 mention that the reference implementation of srfi 16 is
> now incorrect, and indeed, cannot be portably implemented together with
> srfi 102.

Nowhere do I insist that case-lambda arities must be the "expected"
ones, only that they may be.

There is nothing wrong with the reference implementation of SRFI 16 and
it is not fundamentally at odds with anything in the proposal or
portable reference implementations of it.  It would be perfectly
acceptable for an implementation of this SRFI to report that every
procedure constructed with case-lambda accepts 0 or more arguments.  An
implementation may do this for any procedure, in fact.  On the other
hand, an implementation that supports better arity information for
case-lambda procedures may say a function accepts "1 or 3 arguments" for
example.  But this is only correct if applying the function to any
number of arguments that is neither 1 nor 3 results in an error.

David