It's clear to me that I can build a macro for this and make my life easier. 
However, I still need to call the macro. And if I don't I get an error. I 
really wish I could use functions multiple values also in contexts where one 
value is required, without even needing to know that the function returns more 
values. 

The most classic example is the integer division: the function's purpose is to 
return the integer which results by dividing two numbers. But it can also 
return the rest (modulo) of the division, as a "secondary" return value. It 
makes perfect sense since the modulo is already known, without any additional 
computation. But the purpose of the function remains the same: it will give you 
the division result. The modulo is just a by-product which happens to exist and 
therefore is also offered to the caller, which may choose to use it or not. 
Because it's secondary it will be ignored silently when the function is used in 
a single-value context. The caller could not event know that there are two 
returned values.

This philosophy of returning more than needed is present throughout lisp. I 
find it very good. It contributes to the shortness of the code.

I can also imagine situations where I would like to enhance a function of mine, 
by adding an extra return value, but not having to change the code where the 
function is used, because the semantic of the function has not changed. It is 
merely an enhancement. I must admit though, that such situation are not likely 
to occur often.

Disadvantage 1: By making the first value more important than others, you are 
enforcing a semantic, and everyone using multiple values will have to obey. But 
then you can always use lists, which do make sense. Say, you have two return 
values of equal importance (and it should be an error not to bind them when 
calling the function) and several by-products (which will be ignored silently 
if not bound). In this case, the first return value would be a list of two, and 
subsequent values would be my by-products.

Disadvantage 2: The syntax check is not so strict anymore. We all know where 
this leads. But I would happily trade it for the number of chars it saves me 
from typing (and of course the cleaness it adds to the code).

Razvan




________________________________
From: John Cowan <[email protected]>
To: Razvan Rotaru <[email protected]>
Cc: "[email protected]" <[email protected]>
Sent: Friday, May 27, 2011 5:56 PM
Subject: Re: [Scheme-reports] values

Razvan Rotaru scripsit:

> The truth is most of the time I'm interested in one value, not all
> of them. In my oppinion Lisp is right when assuming that one of the
> values returned as result is more important than others, and does not
> raise an error when I use such a function in a context where only one
> result is expected.

Use this trivial wrapper:

(define-syntax strip-values
  (syntax-rules ()
    ((strip-values exp)
     (call-with-values
       (lambda () exp)
       (lambda x (if (null? x) 'bogus (car x)))))))

> Additionally, in the way scheme treats multiple values, there is
> little difference between returning a list with the values, and
> returning the values as such (using the (values ...) form). I could
> very well use the list, and would not need to have the (values ...)
> form built into the language.

You could.  However, there may be a difference in performance.

-- 
An observable characteristic is not necessarily         John Cowan
a functional requirement.  --John Hudson                [email protected]
_______________________________________________
Scheme-reports mailing list
[email protected]
http://lists.scheme-reports.org/cgi-bin/mailman/listinfo/scheme-reports

Reply via email to