[plt-scheme] How do I convert (values ...) to something I can do something with?
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¢s dollars cents) (+ cents (* 100 dollars)))
(define (f-that-returns-dollars&sense) (list 12 34))
(apply f-of-dollars¢s (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.
rac
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