> The formal semantics uses:
>
> - wrong “wrong number of arguments”
>
> - wrong “too few arguments”
>
> As "wrong" is implementation-defined, this does not help.
> Furthermore, it is an implementation detail and may or may not be
> observable in the meaning that is associated with an expression
> through $\mathcal E$.
>
> So I guess "bit 0 == definitely takes those branches in the formal
> semantics" is what is meant. Is there a simple way to refer to
> parts of
> a denotational semantics in English prose?
>
> In some particular implementation, the function $\mathcal E$ can
> give `((lambda () 42))' and `((lambda (x) 42))' the same meaning.
> In other words, there is no way to distinguish the two expressions
> if we do not want to give up the concept of "meaning".
>
> Of course, you can formulate in English prose "if a procedure with k
> formal arguments is called with n actual arguments" (which should
> correspond to the branches you are referring to), but what does it help?
Maybe the key is that the interpretation of the word "definitely" comes
from outside the formal semantics. So if a particular Scheme
implementation knows that it will definitely give the meaning of "wrong"
to a procedure call where the k'th argument is present, then bit k can
be zero. (Again, I have no knowledge of denotational semantics so it's
entirely possible I don't understand some finer point here.)
> In what sense is
>
> (define (procedure-arity-mask proc) 0)
>
> or
>
> (define (procedure-arity-mask proc) <random-integer>)
>
> not a faithful implementation of the specification?
I got the impression that a 0-bit gives a much stronger guarantee about
what will happen than a 1-bit. So (define (procedure-arity-mask proc) 0)
would be very odd and for all practical purposes incorrect, whereas
(define (procedure-arity-mask proc) -1) would be unarguably correct
(though not useful for extracting any practical information).