[plt-scheme] How do I convert (values ...) to something I can do something with?

From: Richard Cleis (rcleis at mac.com)
Date: Wed Mar 10 01:02:16 EST 2010

I like to apply functions to lists that are returned by other functions; the arguments of the applying function assign names to the members of the list:

(define  (f-of-dollars&cents dollars cents) (+ cents (* 100 dollars)))
(define  (f-that-returns-dollars&sense) (list 12 34))

(apply f-of-dollars&cents (f-that-returns-dollars&sense))

If the applied function has a different number of arguments, you are 'self-checked' because scheme will give an error.

Contracts are much more thorough with this sort of thing, though.


On Mar 9, 2010, at 9:38 PM, Todd O'Bryan wrote:

> Stylistically, is one better/more idiomatic than the other? I thought
> about returning a list, but I have this aversion to complex nested
> structures that aren't self-descriptive. (Yeah, I know--if
> s-expressions freak me out, I'm looking for trouble coding in Scheme.)
> I could define a struct so that the parts have names; maybe that's the
> best thing to do.
> I guess I decided to return multiple-values because it forces me to
> check myself. I can't just assign the return value from the function
> to a single variable, so if I screw up and forget that it returns
> multiple values, I should get an error fairly early. Within my code,
> the multiple-value thing isn't a problem at all. It's just when I was
> trying to write test cases that it became annoying.
> Does anyone else sometimes feel like you're learning a foreign
> language by listening to tapes? I have this constant worry that, while
> I think I'm speaking Scheme, when I finally start talking to native
> speakers, they're going to find my accent either incomprehensible or
> really funny.
> Todd
> On Tue, Mar 9, 2010 at 11:26 PM, Matthias Felleisen
> <matthias at ccs.neu.edu> wrote:
>> Sure, return a list instead of multiple values. -- Matthias
>> On Mar 9, 2010, at 11:14 PM, Todd O'Bryan wrote:
>>> Thanks. I saw those, but they didn't register...
>>> If (foo 'x) returns multiple values, is there any easier way than
>>> (call-with-values (lambda () (foo 'x)) list)
>>> to convert it to a list?
>>> On Tue, Mar 9, 2010 at 11:05 PM, Carl Eastlund <cce at ccs.neu.edu> wrote:
>>>> On Tue, Mar 9, 2010 at 11:02 PM, Todd O'Bryan <toddobryan at gmail.com> wrote:
>>>>> I've written a function that returns multiple values. But now I can't
>>>>> figure out how to check the silly thing.
>>>>> Sorry if this is a stupid question, but how do I convert a (values
>>>>> ...) expression into something I can wrap my parentheses around?
>>>>> Todd
>>>> If you know exactly how many values you'll be getting, use let-values
>>>> or define-values.  If you don't, use call-with-values.  They're all in
>>>> the Help Desk.
>>>> --Carl
>>> _________________________________________________
>>> For list-related administrative tasks:
>>> http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> _________________________________________________
> For list-related administrative tasks:
> http://list.cs.brown.edu/mailman/listinfo/plt-scheme

Posted on the users mailing list.