<div dir="ltr"><div><div><div><div><div>Ah that unfortunately explains a lot. Thank you Matthew for this explanation.<br></div><div>It&#39;s too bad that one needs to throw away nice semantics for speed...<br></div><div><br>

</div>Neil&#39;s macro idea may then well be one of the best intermediate solutions then.<br><br></div><div>Jens, thanks for all the links, they are quite informative.<br></div><div>Indeed, quite a number of people seem unhappy with `values&#39;.<br>

</div><div><br></div>However, since I did not find an answer for the following, I will risk this anyway: <br>Then why not return lists instead of values? Performance problem again?<br></div><div>There would not be such a thing as &quot;multiple return values&quot; though, and one should not see them this way.<br>

</div><div>Several values returned in a list is just a list, i.e., a single return value. Then there are helpers to bind several values from a list, etc.<br>No need for `apply-values&#39; or `call-with-values&#39;, just use `apply&#39;.<br>

Therefore returning `(list 1)&#39; would of course be different from returning `1&#39;, but if you don&#39;t see them as multiple return values, it&#39;s not inconsistent.<br></div><div>The type of the procedure  would tell what is returned anyway.<br>

</div>Some languages like Python, PHP (and Matlab?) do that, and I find this more convenient than `values&#39;.<br></div></div><div><div>A &quot;problem&quot; would then be quieter errors for multiple/single value mismatch, but I don&#39;t really see this one as important.<br>

</div><div>I also don&#39;t see the need for a different data type like `sequences&#39; as they call it in Jen&#39;s thread.<br><br></div><div>When I use `values&#39;, either I (have to) bind them directly to identifiers, or I turn them into a list of values to manipulate them otherwise.<br>

The above would make this much easier and simpler I suspect.<br></div><div><br>Laurent<br></div><div><br><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jul 11, 2013 at 5:18 PM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu" target="_blank">mflatt@cs.utah.edu</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">To elaborate on &quot;currently not possible&quot; (because this idea shows up<br>
from time to time), allowing splicing of results in function-call<br>
subexpressions would break equivalences that are currently exploited by<br>
macros and the compiler.<br>
<br>
For example, many macros assume that<br>
<br>
 (rator rand1 rand2 ... randn)<br>
<br>
can be rewritten as<br>
<br>
 (let ([r rator]<br>
       [a1 rand1]<br>
       [a2 rand2]<br>
       ...<br>
       [an randn])<br>
   (r a1 a2 ... an))<br>
<br>
That would not be the case if the `rand&#39;s can produce multiple values.<br>
(I assume that you don&#39;t want to allow binding multiple values to a<br>
variable in `let&#39;.) I think that disallowing this kind of<br>
transformation would make many macros more difficult to implement ---<br>
and maybe impossible, in some cases.<br>
<br>
The Racket compiler takes advantage of transformations like the one<br>
above to speed up your code. Although the compiler could still perform<br>
transformations when the relevant subexpressions are known to be<br>
single-valued, I think the transformations would apply much less often<br>
than now.<br>
<br>
Along similar lines, various tools can tell statically you that<br>
<br>
 (cons e1 e2 e3)<br>
<br>
will be an arity error (assuming that `cons&#39; is the usual binding).<br>
That kind of support would become much weaker, since `e2&#39; might return<br>
zero values while `e1&#39; and `e3&#39; return a single value.<br>
<br>
In short, the kind of splicing that you suggest is a significant sense<br>
more &quot;dynamic&quot; than Racket. You could always embed such a dynamic<br>
language in Racket. Due to macros, however, I don&#39;t think it would work<br>
to re-interpret our existing code as being written in that language.<br>
And due to the extra constraints on the compiler and run-time system,<br>
I&#39;m certain that it would perform worse than Racket. Overall, my sense<br>
is that the potential extra convenience of splicing values is not worth<br>
the costs.<br>
<div><div class="h5"><br>
At Thu, 11 Jul 2013 10:42:52 -0400, Matthias Felleisen wrote:<br>
&gt;<br>
&gt; Your uses of values are covered in apply/map/append/list trickeries. Using<br>
&gt; values might be more elegant, but yes, it&#39;s currently not possible.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Jul 11, 2013, at 8:56 AM, Laurent wrote:<br>
&gt;<br>
&gt; &gt; In some postfix languages, if a procedure returns multiple values, these<br>
&gt; values can be used directly as multiple arguments to another procedure call,<br>
&gt; i.e., they are &quot;spliced&quot; in the latter call.<br>
&gt; &gt; In an extended Racket, this would look like this:<br>
&gt; &gt;<br>
&gt; &gt; (+ (values 1 2) (values 3 4))<br>
&gt; &gt; would be equivalent to<br>
&gt; &gt; (+ 1 2 3 4)<br>
&gt; &gt;<br>
&gt; &gt; (map values &#39;(0 1 2) &#39;(a b c))<br>
&gt; &gt; would return<br>
&gt; &gt; &#39;(0 a 1 b 2 c)<br>
&gt; &gt;<br>
&gt; &gt; (call-with-values (lambda()(my-proc ....)) list)<br>
&gt; &gt; would simply be<br>
&gt; &gt; (list (my-proc ....))<br>
&gt; &gt;<br>
&gt; &gt; (values (values 1 2) (values &#39;a &#39;b))<br>
&gt; &gt; would be equivalent to<br>
&gt; &gt; (values 1 2 &#39;a &#39;b)<br>
&gt; &gt;<br>
&gt; &gt; Correct me if I&#39;m wrong, but I think all the cases where this feature should<br>
&gt; be useful currently throws an error, so it would probably break only very<br>
&gt; little.<br>
&gt; &gt;<br>
&gt; &gt; Such a missing feature tickles me from time to time, and I often find that<br>
&gt; Racket `values&#39; system is too cumbersome to be used more often, i.e., you need<br>
&gt; to go through stages of `call-with-values&#39;, &#39;let/define-values&#39;, `(apply values<br>
&gt; ....)&#39;, etc. and I often find myself not wanting to go down this road.<br>
&gt; &gt;<br>
&gt; &gt; IMO, `values&#39; is *meant* to be the way I describe above: `values&#39; is exactly<br>
&gt; like `list&#39;, except than instead of encapsulating the values in a container, it<br>
&gt; splices them in-place.<br>
&gt; &gt;<br>
&gt; &gt; Do you see some disadvantages of using values this way?<br>
&gt; &gt; For example, in some occasions, for things like<br>
&gt; &gt; (define (foo x) (values x x))<br>
&gt; &gt; (map + (foo &#39;(1 2 3)))<br>
&gt; &gt; it may be more difficult to infer that there are actually 2 lists in the map,<br>
&gt; but to me it&#39;s just a matter of style/taste/comments/documentation, not a<br>
&gt; matter of feature.<br>
&gt; &gt;<br>
&gt; &gt; Laurent<br>
&gt; &gt; ____________________<br>
&gt; &gt;  Racket Users list:<br>
&gt; &gt;  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;<br>
&gt;<br>
</div></div>&gt; ------------------------------------------------------------------------------<br>
&gt; [application/pkcs7-signature &quot;smime.p7s&quot;] [~/Desktop &amp; open] [~/Temp &amp; open]<br>
<div class="HOEnZb"><div class="h5">&gt; ____________________<br>
&gt;   Racket Users list:<br>
&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></blockquote></div><br></div>