<div dir="ltr"><div>I don&#39;t use continuations sufficiently to tell whether it would have been better or not.<br>Anyway, I wasn&#39;t complaining at all about what you wrote or should have written &minus;since in general I really only care about what I write myself&minus; but about what I should have written if following the Style this way. The existence of `and-let*&#39; shows there is another solution, so I&#39;m happy with that.<br>

<br></div>Thank you all,<br>Laurent<br><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jun 11, 2013 at 9:22 PM, Robby Findler <span dir="ltr">&lt;<a href="mailto:robby@eecs.northwestern.edu" 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">Maybe I should have used let/ec? Or a define-based variant of that?<span class="HOEnZb"><font color="#888888"><div><br>

</div></font></span><div><span class="HOEnZb"><font color="#888888">Robby</font></span><div><div class="h5"><span></span><br><br>On Tuesday, June 11, 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>I&#39;m also open to other solutions, but I find the (and (let (and (let (and ...))))) dance really inconvenient (verbose and not readable).<br><br>So maybe it can be made cleaner, like not use `define&#39; but `let&#39; (as I actually did), and maybe use a keyword as Ian does, to show that it is not a normal expression, e.g.:<br>




<span style="font-family:courier new,monospace">(define (get-x-spot char-width)<br>&nbsp; (and char-width<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #:let dc (get-dc)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #:let style (or (send (get-style-list) find-named-style &quot;Standard&quot;)<br>




&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (send (get-style-list) find-named-style &quot;Basic&quot;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #:let fnt (send style get-font)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #:let-values (xw _1 _2 _3) (send dc get-text-extent &quot;x&quot; fnt)<br>




&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (+ left-padding (* xw char-width))))<br><br></span></div><div><span style="font-family:courier new,monospace"><span style="font-family:arial,helvetica,sans-serif">This way you would not need to care about the actual result of the `#:let&#39;s (and you could even add some `#:for-effect&#39; actions if you like ;).</span><br>




</span></div><br><div><div><div class="gmail_extra">Laurent<br></div><div><br><div>On Tue, Jun 11, 2013 at 7:27 PM, Carl Eastlund <span dir="ltr">&lt;<a>cce@ccs.neu.edu</a>&gt;</span> wrote:<br>

<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>I don&#39;t have a big problem with the version that uses let.&nbsp; But my point isn&#39;t really about the code quality, it&#39;s about the can of worms being opened with the specific proposed solution.&nbsp; I&#39;m open to other solutions.<br>






<br></div>Also,
 re: definitions in and, bear in mind that definition macros do all 
kinds of crazy things.&nbsp; Some might expand into multiple forms, including
 for-effect expressions.&nbsp; That&#39;s another reason it&#39;s dangerous to put 
definitions into abnormal contexts that interpret them as anything other
 than a sequence of definitions and effects.&nbsp; You don&#39;t want spurious 
(void) or (values) or some such to spoil your conditional.<span><font color="#888888"><br>
<br clear="all"><div>Carl Eastlund<br><br></div></font></span><div><div><div><div>On Tue, Jun 11, 2013 at 1:21 PM, Laurent <span dir="ltr">&lt;<a>laurent.orseau@gmail.com</a>&gt;</span> wrote:<br>



<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div>Interesting, I see your point (not yet sure I adhere to it though).<br><br>



</div>Anyway don&#39;t you think there is a readability problem with the mentioned code?<span><font color="#888888"><br><br></font></span></div><span><font color="#888888">Laurent<br></font></span></div>

<div><div><div>

<br><br><div>On Tue, Jun 11, 2013 at 7:15 PM, Carl Eastlund <span dir="ltr">&lt;<a>cce@ccs.neu.edu</a>&gt;</span> wrote:<br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">








<div dir="ltr"><div><div><div>I don&#39;t like the idea of definitions inside and, at all.&nbsp; I&#39;ll elaborate on why.<br><br></div>Internal definitions and for-effect expressions make sense to me when computing a single result value, where the last form in sequence is the result and everything else is just context for that.<br>










<br></div>They do not make sense to me in function arguments and other similar contexts where, normally, each term&#39;s value contributes something to the result.&nbsp; Every expression in a function application has a result that is used.&nbsp; Every expression in an and form has a result that is used, if evaluation doesn&#39;t stop earlier.<br>










<br>If we started adding definitions to and, or, &amp;c., then suddenly I have to wonder which terms are used as definitions and which as arguments.&nbsp; Worse yet, someone some day will want to put in an expression for effect in the middle of an and, and then we&#39;ll have some real chaos.<br>










<br></div>I&#39;m all for definitions anywhere they can be clearly seen as not part of the result form.&nbsp; Let&#39;s not put them in between arguments whose results matter, please.<span><font color="#888888"><br>

</font></span></div><div><span><font color="#888888"><br clear="all">

<div>Carl Eastlund</div>
<br><br></font></span><div><div>On Tue, Jun 11, 2013 at 12:49 PM, Laurent <span dir="ltr">&lt;<a>laurent.orseau@gmail.com</a>&gt;</span> wrote:<br>





</div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div>

<div dir="ltr"><div><div><div><div><div><div><div>When I see what Robby is forced to write when following the Style:<br><a href="https://github.com/plt/racket/commit/09d636c54573522449a6591c805b38f72b6f7da8#L4R963" target="_blank">https://github.com/plt/racket/commit/09d636c54573522449a6591c805b38f72b6f7da8#L4R963</a><br>












</div><br>I cannot help but think that something is wrong somewhere (it may not be the Style, and in case it wasn&#39;t clear I&#39;m certainly not criticizing Robby&#39;s code).<br></div><div></div>Using `let&#39; and `and&#39; instead, although<span style="font-family:courier new,monospace"><span style="font-family:arial,helvetica,sans-serif"> being a bit better since it avoids all the [else #f], is not that big an improvement:</span><br>












<br>(define (get-x-spot char-width)<br>&nbsp; (and<br>&nbsp;&nbsp; char-width <br>&nbsp;&nbsp; (let ([dc (get-dc)])<br>&nbsp;&nbsp;&nbsp;&nbsp; (and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (let ([style (or (send (get-style-list) find-named-style &quot;Standard&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (send (get-style-list) find-named-style &quot;Basic&quot;))])<br>












&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (and<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sty</span></div></div></div></div></div></div></div></div></blockquote></div></div></blockquote></div></div></div></div></blockquote></div></div></div></div></div></blockquote></div></div></div></div>


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