Do we have performance measurements that show the importance of such reorderings?<br><br>Robby<br><br>On Thursday, October 6, 2011, Neil Toronto &lt;<a href="mailto:neil.toronto@gmail.com">neil.toronto@gmail.com</a>&gt; wrote:<br>
&gt; On 10/06/2011 01:20 PM, Eli Barzilay wrote:<br>&gt;&gt;<br>&gt;&gt; Just now, Neil Toronto wrote:<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; On 10/06/2011 12:28 PM, Prabhakar Ragde wrote:<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; On 10/6/11 2:12 PM, Eli Barzilay wrote:<br>
&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt;&gt; Sam is talking about building the ASTs *while* matching, which is<br>&gt;&gt;&gt;&gt;&gt; what Jay was trying to do with uses of `app&#39;. I think that a<br>&gt;&gt;&gt;&gt;&gt; teaching context is in particular one where such a thing doesn&#39;t<br>
&gt;&gt;&gt;&gt;&gt; fit -- it obscures the distinction between the side the sexpr<br>&gt;&gt;&gt;&gt;&gt; goes into, and the side where an AST comes out.<br>&gt;&gt;&gt;&gt;<br>&gt;&gt;&gt;&gt; Okay, I see the distinction, and I apologize for not having fully<br>
&gt;&gt;&gt;&gt; understood Jay&#39;s example. I agree that this obscurity is<br>&gt;&gt;&gt;&gt; hazardous. I think, though, that I have always assumed<br>&gt;&gt;&gt;&gt; left-to-right matching, though I may never have constructed<br>
&gt;&gt;&gt;&gt; anything that would break if it didn&#39;t happen. --PR<br>&gt;&gt;&gt;<br>&gt;&gt;&gt; I think most people expect branching constructs like &#39;match&#39; to make<br>&gt;&gt;&gt; in-order (left-to-right/depth-first), short-cutting decisions.<br>
&gt;&gt;&gt; Additionally, the cases themselves do this. So I think the fact that<br>&gt;&gt;&gt; the patterns don&#39;t is very surprising.<br>&gt;&gt;<br>&gt;&gt; IIRC, the cases are also reordered to optimize tests -- and that&#39;s an<br>
&gt;&gt; even more important optimization:<br>&gt;&gt;<br>&gt;&gt;   -&gt;  (define (list?? x) (printf &quot;list-checking ~s\n&quot; x) (list? x))<br>&gt;&gt;   -&gt;  (define (one?? x) (printf &quot;one-checking ~s\n&quot; x) (eq? 1 x))<br>
&gt;&gt;   -&gt;  (match &#39;(1 (2) 3)<br>&gt;&gt;        [(list (? one??) 2 3) 1]<br>&gt;&gt;        [(list _ (? list??) _) 2]<br>&gt;&gt;        [(list (? one??) 20 30) 3])<br>&gt;&gt;   list-checking (2)<br>&gt;&gt;   2<br>
&gt;&gt;<br>&gt;&gt; and after Jay broke it, you get<br>&gt;&gt;<br>&gt;&gt;   one-checking 1<br>&gt;&gt;   list-checking (2)<br>&gt;&gt;   2<br>&gt;&gt;<br>&gt;&gt; IMO it is perfectly fine to require that stuff used in `match&#39;<br>
&gt;&gt; patterns is side-effect-free, and therefore cachable and reorderable.<br>&gt;<br>&gt; Well I&#39;ll be darned.<br>&gt;<br>&gt; I suppose this shows just how deeply I hold assumptions about order and shortcutting.<br>
&gt;<br>&gt; Neil T<br>&gt;<br>&gt; _________________________________________________<br>&gt;  For list-related administrative tasks:<br>&gt;  <a href="http://lists.racket-lang.org/listinfo/dev">http://lists.racket-lang.org/listinfo/dev</a><br>
&gt;