[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Scheme-reports] Multiple values in BEGIN


Perhaps I have missed something in the report, but what is the behaviour
of multiple values returned to a non-final expression in a BEGIN form?
i.e. what does the following expression do?

(let ((modified? 'no))
     (begin (and (set! modified? 'yes)
                 (values 'yes 'yes))

The current wordings for BEGIN, and implicit BEGINS like LAMBDA and COND
say nothing about this possibility, and so I'm assuming that it falls
back to

"Except for continuations created by the call-with-values procedure, all
continuations take exactly one value. The effect of passing no value or
more than one value to continuations that were created by
CALL-WITH-VALUES is unspecified".

I think this is unfortunate, as returning multiple values behaves
consistently across all the Schemes that I tried (it returned 'yes for
Chicken, Racket, Ypsilon, Mosh, Ikarus, Stklos, MIT/GNU Scheme, Guile,
Chibi and Scheme48), but the report leaves it unportable. The R6RS is
slightly better than the current situation, saying

"The continuations of all non-final expressions within a sequence of
expressions, such as in lambda, begin, let, let*, letrec, letrec*,
let-values, let*-values, case, and cond forms, usually take an
arbitrary number of values."

Would it be possible to add similar language to the report, perhaps
replacing "usually" with "may"? The definition of BEGIN in section 7.3
would also need to change to

(define-syntax begin
  (syntax-rules ()
    ((begin exp)
    ((begin exp1 exp2 ...)
         (lambda () exp1)
       (lambda args
         (begin exp2 ...))))))


Scheme-reports mailing list