We do have warnings for things like the optimizer detecting a bad application of a function, for example, but they go into the logger and you have to say the magic words (open sesame?) to get them out.<div><br></div><div>For this kind of thing, my preference would be to change match than to issue a warning. I don&#39;t like warnings that are basically admitting weaknesses in the language design.... Of course, changing a core thing like that may be more trouble than it is worth, due to backwards compatibility concerns, which is why I think it is worth raising here to see what others think.</div>
<div><br></div><div>Alternatively, we could revisit &#39;else&#39; in racket2 and leave racket alone.</div><div><br></div><div>Robby<br><br>On Friday, May 3, 2013, Laurent  wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div>That one is twisted indeed, if you forget about how `else&#39; must be written in `match&#39; (which I had, not using match too much).<br>I was thinking about issuing a warning when a syntax-parameter gets shadowed (if that is even catchable).<br>


Then suddenly I realized Racket doesn&#39;t do warnings. (Is there a reason for that?)<br><br></div>Laurent<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, May 3, 2013 at 3:39 PM, Robby Findler <span dir="ltr">&lt;<a href="javascript:_e({}, &#39;cvml&#39;, &#39;robby@eecs.northwestern.edu&#39;);" target="_blank">robby@eecs.northwestern.edu</a>&gt;</span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>[ for those that just want to see what I&#39;m getting at, scroll to the end ]</div><div><br></div>While the docs are clear (enough) on this point, I think it can be quite confusing. See if you spot the bug in this program:<div>



<br></div><div><div>#lang racket</div><div>(define (find-literals e)</div><div>  (define literals &#39;())</div><div>  (let loop ([e e])</div><div>    (match e</div><div>      [`(λ (,x) ,e)</div><div>       (loop e)]</div>



<div>      [`(,e1 ,e2)</div><div>       (loop e1)</div><div>       (loop e2)]</div><div>      [(? symbol?) (void)]</div><div>      [else</div><div>       (cond</div><div>         [(member e literals)</div><div>          (void)]</div>



<div>         [else </div><div>          (set! literals (cons e literals))])]))</div><div>  literals)</div><div><br></div><div>(module+ test </div><div>  (require rackunit)</div><div>  (check-equal? (find-literals &#39;(λ (x) x)) &#39;())</div>



<div>  (check-equal? (find-literals &#39;((λ (x) x) 1)) &#39;(1))</div><div>  (check-equal? (find-literals &#39;((λ (x) x) #f)) &#39;(#f)))</div></div><div><br></div><div><br></div><div>Hint: the last test case fails. Second hint: if you switch it to use sets, it starts working. Third hint: this isn&#39;t about lists. :)</div>



<div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>



<div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>



<div><br></div><div><br></div><div><br></div><div>The bug is that &#39;else&#39; is treated as a variable in match, so it gets bound to #f, which shadows the else in the cond which .... is confusing.</div><div><br></div>


<div>
So, how about making match treat else specially?</div><div><br></div><div><br></div><div>I don&#39;t ask this completely from outer space; there was a bug in Redex&#39;s random generation that was caused exactly by this shadowing of else.</div>


<span><font color="#888888">
<div><br></div><div>Robby</div><div><br></div><div><br></div><div><br></div>
</font></span><br>_________________________<br>
  Racket Developers list:<br>
  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
<br></blockquote></div><br></div>
</blockquote></div>