On Thu, Jan 8, 2009 at 8:57 AM, Dave Herman <span dir="ltr">&lt;<a href="mailto:dherman@ccs.neu.edu">dherman@ccs.neu.edu</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
[NB: I agree with Mark that we should not focus too much on concrete syntax yet, so I&#39;ll also plead for people to avoid quibbling with details of syntax for the moment.]<br>
<br>
Instead of &quot;reveal&quot; I&#39;d prefer block expressions with a fixed (but optional) tail expression:<br>
<br>
 &nbsp; &nbsp;BlockExpr ::= &quot;{&quot; (Stmt|Decl)* (&quot;=&gt;&quot; Expr)? &quot;}&quot;</blockquote><div><br>In the spririt of postponing concrete syntax issues, I suggest we
continue to use placeholder identifiers. In particular, some have
advocated &quot;^&quot; for &quot;lambda&quot; and here suggest &quot;=&gt;&quot; for &quot;reveal&quot;. To a Scala
programmer, &quot;=&gt;&quot; (but infix) is more natural for &quot;lambda&quot;. To a
Smalltalk programmer, &quot;^&quot; is more natural for &quot;reveal&quot;. Since we&#39;ve got
swapped possibilities for the same pair, let&#39;s avoid them for now.<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
The semantics would be like a block statement, but the result value is the result of the tail expression, or the undefined value if it&#39;s omitted. The tail expression would be in the same scope chain as the whole block but would be a mandatory tail call.<br>

<br>
This would be used for the body of lambdas, and addresses Waldemar&#39;s concern about unintended leakage. It admits an extremely simple definition of tail position.<br>
<br>
Moreover, it could be part of a let expression form:<br>
<br>
 &nbsp; &nbsp;Expr ::= ... | &quot;let&quot; LetHead BlockExpr<br>
<br>
This single form functions as an expression or a statement, without the need for two separate forms. (MarkM would probably like for the LetHead to be optional, which is unproblematic but a detail we can postpone discussing.)</blockquote>
<div><br>Correct. I like all this. <br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
 To contrast with &quot;reveal&quot;: when there&#39;s mutable state I&#39;d prefer it to be explicit. Anything you might do with reveal you could do with let expressions using a local variable. For example:<br>
<br>
 &nbsp; &nbsp;lambda(x){ if (p()) reveal(1); else reveal(2); }</blockquote><div><br>I&#39;m happy to drop my original proposal in favor of yours. I think I like yours better anyway. But for the record, mine was declarative and the above would have been illegal under the &quot;no more than once not nested&quot; restrictions. <br>
<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">could be expressed as<br>
<br>
 &nbsp; &nbsp;lambda(x) { let tmp; if (p()) tmp = 1; else tmp = 2; =&gt; tmp }<br>
<br>
As I say, I prefer not to hide the mutation.<br>
</blockquote><div><br>For this case, that&#39;s how you&#39;d have to write it in my proposal as well. <br></div></div><br clear="all"><br>-- <br> &nbsp; &nbsp;Cheers,<br> &nbsp; &nbsp;--MarkM<br>