Named return values, ah the dream of symmetry.<br><br>-Markku<br><br>----- Reply message -----<br>From: &quot;Zayr Okale&quot; &lt;zayr.okale@gmail.com&gt;<br>To: &quot;Tomasz Rola&quot; &lt;rtomek@ceti.pl&gt;<br>Cc: &lt;users@racket-lang.org&gt;<br>Subject: [racket] Multiple return values<br>Date: Thu, Dec 15, 2011 13:39<br><br><br>On 14/12/2011 21:20, Tomasz Rola wrote:<br>&gt; On Wed, 14 Dec 2011, Zayr Okale wrote:<br>&gt;<br>&gt;&gt; Hello, everyone.<br>&gt;&gt;<br>&gt;&gt; Can someone please explain to me multiple return values? Not what it does,<br>&gt;&gt; I understand that much, but what is this feature for? In what situations is<br>&gt;&gt; it useful?<br>&gt; I am not sure how much usable values/call-with-values are in Scheme. In<br>&gt; Common Lisp, some functions return multiple values, for example floor:<br>&gt;<br>&gt; [1]&gt; &nbsp;(floor 13 4)<br>&gt; 3 ;<br>&gt; 1<br>&gt;<br>&gt; In this case, one computation is performed to have two values, and user is<br>&gt; free to use only one of them or both. She can also signal her intentions<br>&gt; about ignoring some of the returned values with (declare (ignore ...)),<br>&gt; which, I guess, should be used by compiler/interpreter to optimize things<br>&gt; better.<br>&gt;<br>&gt; This &quot;ignore&quot; is very handy, like below:<br>&gt;<br>&gt; [3]&gt; &nbsp;(decode-universal-time (get-universal-time))<br>&gt; 43 ;<br>&gt; 9 ;<br>&gt; 18 ;<br>&gt; 14 ;<br>&gt; 12 ;<br>&gt; 2011 ;<br>&gt; 2 ;<br>&gt; NIL ;<br>&gt; -1<br>&gt;<br>&gt; Also, comparing to C, this would be done by passing pointer to C struct to<br>&gt; the function, which would then fill it with days and month etc. So, I<br>&gt; think multiple values could be used instead of passing/returning<br>&gt; structures. From optimization point, it would be tricky to declare things<br>&gt; like &quot;I pass this structure here to you, but I only need a month number&quot;.<br>&gt; And it would be tricky (and trashy) to have multitude of smaller<br>&gt; functions, each for computing year, month, hour from number of seconds.<br>&gt;<br>&gt; Last but not least, this may serve as a way to help using information in<br>&gt; place where it is needed:<br>&gt;<br>&gt; [4]&gt; &nbsp;(read-line )<br>&gt; aa aa<br>&gt; &quot;aa aa&quot; ;<br>&gt; NIL<br>&gt;<br>&gt; Here, read-line returns bot a line of text and a value signaling if there<br>&gt; was EOF condition. Again, one can ignore EOF-value if this is what one<br>&gt; really wants.<br>&gt;<br>&gt; Regards,<br>&gt; Tomasz Rola<br>&gt;<br>&gt; --<br>&gt; ** A C programmer asked whether computer had Buddha&#39;s nature. &nbsp; &nbsp; &nbsp;**<br>&gt; ** As the answer, master did &quot;rm -rif&quot; on the programmer&#39;s home &nbsp; &nbsp;**<br>&gt; ** directory. And then the C programmer became enlightened... &nbsp; &nbsp; &nbsp;**<br>&gt; ** &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; **<br>&gt; ** Tomasz Rola &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mailto:tomasz_rola@bigfoot.com &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; **<br><br>I even do understand what multiple return values are useful for in CL: <br>&quot;okay, the function calculates other potentially useful values anyway, <br>so no reason not to make them available&quot;.<br><br>Unfortunately, this scenario doesn&#39;t apply to Racket. And this is <br>exactly what prompted my question. Since one of the reasons behind <br>multiple return values is, as David Van Horn pointed out, symmetry with <br>multiple input values (function arguments), then why optional input <br>values are allowed, but optional output values aren&#39;t?<br><br>The situation when all the return values are of equal importance, yet <br>returning a struct or a list is not convenient is, IMHO, quite rare.<br>_________________________________________________<br> &nbsp;For list-related administrative tasks:<br> &nbsp;http://lists.racket-lang.org/listinfo/users<br>