<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Sep 4, 2013 at 9:01 AM, Eric Tanter <span dir="ltr">&lt;<a href="mailto:etanter@dcc.uchile.cl" target="_blank">etanter@dcc.uchile.cl</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Right, all this boils down to the following &quot;strange&quot; (although technically understandable, I guess) behavior:<br>

<br>
if metafunction `different&#39; is defined, then:<br>
<br>
&gt; (term (different x x))<br>
#f<br>
<br>
if it is not defined then:<br>
<br>
&gt; (term (different x x))<br>
&#39;(different x x)<br>
<br>
which, in any context expecting to see if something is #t, is not distinguishable.<br>
<br>
So there is some kind of &quot;implicit unquoting&quot; for defined metafunctions (I don&#39;t know how this is implemented under the hood), which is quite confusing when one would expect errors instead.<br>
<br>
I don&#39;t know if/how that can be fixed, but I can only report that the debugging of such silent bugs is quite frustrating.<br>
<br></blockquote><div><br></div><div>Yeah, I know. This is a general problem in Redex.</div><div><br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<br>
BTW, the doc of `term&#39; says:<br>
&quot;It behaves similarly to quasiquote, except for a few special forms that are recognized (listed below) and that names bound by term-let are implicitly substituted with the values that those names were bound to, expanding ellipses as in-place sublists (in the same manner as syntax-case patterns).&quot;<br>

<br>
But, if `different&#39; is defined, then:<br>
&gt; `(different x x)<br>
&#39;(different x x)<br>
<br>
So the doc should also say something about metafunctions appearing in the term, and how they are treated, no?<br>
<br></blockquote><div><br></div><div>Right!</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<br>
As for backwards compatibility issues, I don&#39;t know how much people rely on side-condition taking something not-#f/#t... Probably too much :)<br>
(also, there could be a `side-condition-soft&#39; variant that is not strict in the boolean-ness, or vice-versa)<br>
<br></blockquote><div><br></div><div>Well, if we&#39;re willing to force clients to change their code, then it isn&#39;t hard for them to write their own metafunctions that turn non-#f things into #ts.</div><div><br></div>
<div><div>But I think you&#39;re right that just changing this is a good idea and backwards compatibility be damned. I&#39;ll put it on my list.</div></div><div><br></div><div>Robby</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

Thanks,<br>
<br>
-- Éric<br>
<div class=""><div class="h5"><br>
<br>
On Sep 4, 2013, at 8:22 AM, Robby Findler &lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt; wrote:<br>
<br>
&gt; These are not errors, technically. The side-condition form in a judgment-form is not unquoted, so that&#39;s a redex expression, not a Racket one. In other words, the side-condition is not (/ 1 0), but &#39;(/ 1 0). Ditto for the &quot;different&quot; example.<br>

&gt;<br>
&gt; Or perhaps you&#39;re already getting that and you&#39;re saying that side-conditions in judgment-forms should insist on receiving booleans?<br>
&gt;<br>
&gt; I see that the current behavior for side-condition was first released more than a year ago, so I&#39;m a bit worried about backwards compatibility. What do you think about that?<br>
&gt;<br>
&gt; Robby<br>
&gt;<br>
&gt;<br>
&gt; On Tue, Sep 3, 2013 at 9:10 PM, Eric Tanter &lt;<a href="mailto:etanter@dcc.uchile.cl">etanter@dcc.uchile.cl</a>&gt; wrote:<br>
&gt; Hi,<br>
&gt;<br>
&gt; Strangely, `side-condition&#39; matches when the associated expression fails with an error.<br>
&gt;<br>
&gt; For instance, using the redex tutorial example, if one writes:<br>
&gt;<br>
&gt;   [(types Γ x_1 t_1)<br>
&gt;    (side-condition (/ 1 0))<br>
&gt;    ------------------------------------<br>
&gt;    (types (x_2 : t_2 Γ) x_1 t_1)]<br>
&gt;<br>
&gt; Then the rule applies, as if it was (side-condition #t).<br>
&gt;<br>
&gt; Of course, (/ 1 0) is not really realistic, but the same happens if one writes:<br>
&gt;<br>
&gt;   [(types Γ x_1 t_1)<br>
&gt;    (side-condition (different x_1 x_2))<br>
&gt;    ------------------------------------<br>
&gt;    (types (x_2 : t_2 Γ) x_1 t_1)]<br>
&gt;<br>
&gt; and forgets to define `different&#39; (assuming it is a standard Redex metafunction)... Instead of a nice error that `different&#39; is undefined, the rule silently applies.<br>
&gt;<br>
&gt; I understand that anything that is not #f is true, but arguably this should not apply to an error. Or is there a good reason why this is so?<br>
&gt;<br>
&gt; Cheers,<br>
&gt;<br>
&gt; -- Éric<br>
&gt;<br>
&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>
&gt;<br>
<br>
</div></div></blockquote></div><br></div></div>