<div dir="ltr">Oh, right! Thanks! I&#39;ll push something that explicitly mentions underscore and adjust the elses to use underscores.<div style><br></div><div style>Robby</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Sat, May 4, 2013 at 9:09 PM, Greg Hendershott <span dir="ltr">&lt;<a href="mailto:greghendershott@gmail.com" target="_blank">greghendershott@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
There will be people who see the long BNF for match in the Reference,<br>
and flee to the Guide to try to learn by example instead. Even when<br>
they later do read the Reference carefully, they&#39;ll be left with first<br>
impressions of idioms from the Guide.<br>
<br>
(I might be one of those people. Cough.)<br>
<br>
The Guide &lt;<a href="http://docs.racket-lang.org/guide/match.html" target="_blank">http://docs.racket-lang.org/guide/match.html</a>&gt; uses `else`<br>
in a couple examples.<br>
<br>
Also, I somehow got the idea that `(var x)` was the only way to do<br>
what `else` can do by accident. So I don&#39;t _think_ I have any code<br>
that&#39;s buggy this way, or, which would break if the change were made,<br>
either way. I think.<br>
<br>
Until I saw your email I didn&#39;t appreciate why it would make sense to<br>
use `_`. Going forward I will.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On Fri, May 3, 2013 at 9:39 AM, Robby Findler<br>
&lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt; wrote:<br>
&gt; [ for those that just want to see what I&#39;m getting at, scroll to the end ]<br>
&gt;<br>
&gt; While the docs are clear (enough) on this point, I think it can be quite<br>
&gt; confusing. See if you spot the bug in this program:<br>
&gt;<br>
&gt; #lang racket<br>
&gt; (define (find-literals e)<br>
&gt;   (define literals &#39;())<br>
&gt;   (let loop ([e e])<br>
&gt;     (match e<br>
&gt;       [`(λ (,x) ,e)<br>
&gt;        (loop e)]<br>
&gt;       [`(,e1 ,e2)<br>
&gt;        (loop e1)<br>
&gt;        (loop e2)]<br>
&gt;       [(? symbol?) (void)]<br>
&gt;       [else<br>
&gt;        (cond<br>
&gt;          [(member e literals)<br>
&gt;           (void)]<br>
&gt;          [else<br>
&gt;           (set! literals (cons e literals))])]))<br>
&gt;   literals)<br>
&gt;<br>
&gt; (module+ test<br>
&gt;   (require rackunit)<br>
&gt;   (check-equal? (find-literals &#39;(λ (x) x)) &#39;())<br>
&gt;   (check-equal? (find-literals &#39;((λ (x) x) 1)) &#39;(1))<br>
&gt;   (check-equal? (find-literals &#39;((λ (x) x) #f)) &#39;(#f)))<br>
&gt;<br>
&gt;<br>
&gt; Hint: the last test case fails. Second hint: if you switch it to use sets,<br>
&gt; it starts working. Third hint: this isn&#39;t about lists. :)<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; The bug is that &#39;else&#39; is treated as a variable in match, so it gets bound<br>
&gt; to #f, which shadows the else in the cond which .... is confusing.<br>
&gt;<br>
&gt; So, how about making match treat else specially?<br>
&gt;<br>
&gt;<br>
&gt; I don&#39;t ask this completely from outer space; there was a bug in Redex&#39;s<br>
&gt; random generation that was caused exactly by this shadowing of else.<br>
&gt;<br>
&gt; Robby<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div></div><div class="HOEnZb"><div class="h5">&gt; _________________________<br>
&gt;   Racket Developers list:<br>
&gt;   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
&gt;<br>
</div></div></blockquote></div><br></div>