<br><br><div class="gmail_quote">On Fri, Dec 16, 2011 at 3:15 PM, Matthias Felleisen <span dir="ltr">&lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Does Racket blindly inherit from Scheme because of history?<br>
<br>
No, Racketeers choose what to take over and what to leave behind.<br></blockquote><div><br>Great, I&#39;m waiting for the fruits of the labour with great anticipation and gratitude ;)<br> <br></div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
Why are multiple values useful?<br>
<br>
Multiple values enable a smooth functional style where pedestrian programmers may have to use clumsy package-unpackage or, worse, imperative style. This improvement shows up especially in loops. Here is a concrete example from a recent program I wrote:<br>

<br></blockquote><div><br>I&#39;ll keep this short since it&#39;s bed-time :)<br><br> Why are multiple return values better than e.g. lists? You can still mix the order of the return values. Only thing you get is guaranteed right number of values. But, this also makes your functions less flexible. You are not able to add any new values because every call site must be fixed, even if the change by itself is backwards compatible (e.g. only adding more values). Doesn&#39;t sound like a meaningful difference. However mixing collections and semantically different values is just bad design. Can&#39;t prevent people from shooting their own legs except maybe in classroom.<br>
<br>Typical case in e.g. Java is to have a pair of Request &amp; Response classes for passing parameters and receiving return values. These are as close as Java can get to named parameters and return values. You will not be able to accidentally mix the order of the parameters or return values. You may have sensible optional / default values. You have co-,  contravariance and backwards compatibility for many changes of the interface. Sounds good, doesn&#39;t it? just the syntax is Java so you&#39;ll grow old typing your solution :) What do you think about that as a practice?<br>
<br>This was just something I think about these days. In Clojure side I use maps quite much with the predictable ups and downs. For Racket I might go with structs, if they had better support for immutability/copying, and I think the situation is improving in this area.<br>
<br>What I have in mind is for example something like this. calculate-statistics would return named return values of #:min and #:max and compiler would check that these are ok at the call sites. Now if the calculate-statistics also returns #:median then it doesn&#39;t matter that I don&#39;t use it in this case. It&#39;s not a bug.<br>
<br>(let# ((#:min min #:max max (calculate-statistics (list 1 2 3 4 1 5 2 3 5 0 3 11))))<br>    ; do something with the min and max<br>    (do-something min))<br><br>Possibly could get rid of the extra typing when you don&#39;t want/need to rename:<br>
<br>(let# ((min max (calculate-statistics (list 1 2 3 4 1 5 2 3 5 0 3 11))))<br>
    ; do something with the min and max<br>
    (do-something min))<br>
<br>(define (calculate-statistics data)<br>    ; do the work<br>    ...<br>    ; return some named values<br>    (return #:min min #:max max #:average average #:median median))<br><br>And again the predictable minimization:<br>
<br>(define (calculate-statistics data)<br>    ; do the work<br>    ...<br>    ; return some named values<br>    (return# min max average median))<br><br><br>I might try implementing something like that when I come up with a decent syntax.<br>
<br></div>-Markku<br></div>