On Sep 22, 2008, at 11:29 AM, Arthur Smyles wrote:
My use case for using 'values' is to pass a primary value and secondary values to a caller. If the caller can only use one value then I want it to use the primary value and discard the secondary values. So what I would like to see is:
(if (values #f #f) #t #f) => #f
since the primary value is false and the 'if' function can only use the primary value.
As it stands now, as a caller of an api that uses 'values', I'd have to deal with it as a specialized data structure, in which case, the utility of it is very limited since I could just as well pass a vector or some other structure.
I think the above semantics could be implemented and still be R5 compliant.
It sound like you want every place in the program that takes a value to check whether there are more than one value returned, and pick the "primary" one.
So if you have
(define (f a b) (+ a b))
(define (g a b) (values a b))
(f (g 0 1) 2)
you'd want the code to f to check that g returned only a single value, strip out extra ones if it returned more than 1, perhaps signal an error if g didn't return any values, do something else?
Common Lisp deals with this somehow, but I'm not sure that we want the semantics of values in Scheme to be complicated so much in able to implement such a proposal.
Brad