<div dir="ltr"><div><div>Thanks for the explanation Robby. It&#39;s actually not bad, just a bit more verbose, but it can then  be tailored easily:<br></div><br>(define-syntax-rule (let/ec/check check body ...)<br>&nbsp; (let/ec return<br>

&nbsp;&nbsp;&nbsp; (define (check v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (unless v (return #f)))<br>&nbsp;&nbsp;&nbsp; body ...<br>&nbsp;&nbsp;&nbsp; ))<br><br>(define/private (get-x-spot char-width)<br>&nbsp; (let/ec/check check<br>&nbsp;&nbsp;&nbsp; (check char-width)<br>&nbsp;&nbsp;&nbsp; (define dc (get-dc))<br>&nbsp;&nbsp;&nbsp; (check dc)<br>

&nbsp;&nbsp;&nbsp; (define 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; (send (get-style-list) find-named-style &quot;Basic&quot;)))<br>&nbsp;&nbsp;&nbsp; (check style)<br>&nbsp;&nbsp;&nbsp; (define fnt (send style get-font))<br>

&nbsp;&nbsp;&nbsp; (define-values (xw _1 _2 _3) (send dc get-text-extent &quot;x&quot; fnt))<br>&nbsp;&nbsp;&nbsp; (+ left-padding (* xw char-width))))<br><br></div><div>I think it&#39;s quite ok then. Good idea.<br></div><div><br></div>Laurent<br></div>

<div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 12, 2013 at 12:15 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"><div dir="ltr">It would have looked like this. &quot;ec&quot; means escaping continuation: it is much weaker than a real continuation, something very much like &#39;return&#39; or &#39;break&#39; in other languages. Except that in Racket you have a little bit more fine-grained control over where you end up escaping out of (it isn&#39;t tied to a function or a loop). In this case, tho, you&#39;d want something that returns from the function. The code would look like this:<div>


<br></div><div><div>&nbsp; (define/private (get-x-spot char-width)</div><div>&nbsp; &nbsp; (let/ec return</div><div>&nbsp; &nbsp; &nbsp; (unless char-width (return #f))</div><div>&nbsp; &nbsp; &nbsp; (define dc (get-dc))</div><div>&nbsp; &nbsp; &nbsp; (unless dc (return #f))</div>


<div>&nbsp; &nbsp; &nbsp; (define style (or (send (get-style-list) find-named-style &quot;Standard&quot;)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (send (get-style-list) find-named-style &quot;Basic&quot;)))</div><div>&nbsp; &nbsp; &nbsp; (unless style (return #f))</div>

<div class="im">
<div>&nbsp; &nbsp; &nbsp; (define fnt (send style get-font))</div></div><div>&nbsp; &nbsp; &nbsp; (define-values (xw _1 _2 _3) (send dc get-text-extent &quot;x&quot; fnt))</div><div class="im"><div>&nbsp; &nbsp; &nbsp; (+ left-padding (* xw char-width))))</div></div>

</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>
Robby</div></font></span><div><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 12, 2013 at 2:49 AM, Laurent <span dir="ltr">&lt;<a href="mailto:laurent.orseau@gmail.com" target="_blank">laurent.orseau@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"><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<div><div><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><font color="#888888"><div><br>

</div></font></span><div><span><font color="#888888">Robby</font></span><div><div><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></div></div>
</blockquote></div><br></div></div></div></div>
</blockquote></div><br></div>