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

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Wed Mar 10 08:38:43 EST 2010

The purpose of multiple values is to increase the "reach" of functional programming within Scheme smoothly: 

 -- fp means you return results instead of mutating some global 
 -- smoothly means 'get errors early and avoid allocating a heavy-duty structure' 

A particularly illustrative example is a recursive function that needs to compute several results at once and use them within the recursion. 

Of course, strictly speaking multiple values aren't necessary and the choice is left to the programmer. 

> 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.

This is a great analogy. I can speak mostly idiomatic English (and I can mangle them, too, if I think it's funny for the occasion) but my accent will always be a bit strange. That's not a bad situation to be in. It would be much much worse if your accent were right and your sentence non-order and idioms were Chinese. 

-- Matthias



On Mar 9, 2010, at 11: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
>> 
>> 



Posted on the users mailing list.