[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: multiple values proposal
> Date: Thu, 18 Mar 1993 10:30:21 -0800
> From: Morry Katz <katz@quilty.stanford.edu>
>
> The second is that the call to VALUES is in argument position and so
> certainly returns the wrong number of values for its continuation.
>
> I really am not sure what the syntax is supposed to be when passing
> multiple values to a continuation, but I agree that Pavel's syntax is
> preferable to mine.
It's not a question of any new syntax, though. Continuations are just
procedures, so you pass multiple arguments to them in the usual way.
> (call-with-values (lambda ()
> (call-with-current-continuation
> (lambda (k)
> (k 1 2 3))))
> (lambda (a b c)
> . . .))
>
> And now, this looks to me like code that's entirely legal under the
> description that was posted.
>
> I have to disagree. I do not see how this is legal under the
> description posted. According to the description: "Except for
> continuations created by the call-with-values procedure, all
> continuations take exactly one value." Since k is not a continuation
> created by the call-with-values procedure, it must accept exactly one
> value, making (k 1 2 3) an illegal expression. Could someone please
> clarify?
But k is exactly the continuation created by CALL-WITH-VALUES. Remember,
CALL-WITH-CURRENT-CONTINUATION never creates a new continuation but rather
simply reifies the one it was called with. There are only a very small set of
contexts in Scheme that can in any way be said to create new continuations:
1) Argument position in a call
2) Procedure position in a call
3) The second subform of a SET! form
4) The first subform of an IF form
5) So-called `command' position in a LAMBDA form
(i.e., body forms other than the last one)
and now
6) Invocation of the first argument to CALL-WITH-VALUES
Every other context merely passes along an existing continuation.
Does this make it clearer?
Pavel