<p>(sorry for the bad indentation, writing s-exps on a phone predictive keyboard is painful...) </p>
<div class="gmail_quote">Le 31 mai 2012 19:21, &quot;Laurent&quot; &lt;<a href="mailto:laurent.orseau@gmail.com">laurent.orseau@gmail.com</a>&gt; a écrit :<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<p>How about a define* that is exactly like let* without the additional indentation level? <br>
E.g.:<br>
 <br>
(define*<br>
 [↑ &quot;foo bar baz&quot;]<br>
 [↑ (substring ↑ 3 8)]<br>
 [str (string-trim ↑)]<br>
 [↑ (regexp-match? #rx&quot;^[a-z].*[a-z]$&quot; str)]) <br>
(and ↑ (string-append &quot;*&quot; str &quot;*&quot;)) </p>
<p>Laurent </p>
<p>Le 31 mai 2012 19:04, &quot;Neil Toronto&quot; &lt;<a href="mailto:neil.toronto@gmail.com" target="_blank">neil.toronto@gmail.com</a>&gt; a écrit :<br>
&gt;<br>
&gt; On 05/30/2012 03:40 PM, Eli Barzilay wrote:<br>
&gt;&gt;<br>
&gt;&gt; Now, lets imagine that instead of a simple `&lt;&gt;&#39; hole, there are two<br>
&gt;&gt; kinds of holes with an &quot;up&quot; or a &quot;down&quot; direction -- this leads to<br>
&gt;&gt; this kind of a syntax:<br>
&gt;&gt;<br>
&gt;&gt;   (○ &quot;foo bar baz&quot;<br>
&gt;&gt;      (substring ↑ 3 8)<br>
&gt;&gt;      (string-trim ↑)<br>
&gt;&gt;      (let ([str ↑]) ↓)<br>
&gt;&gt;      (and (regexp-match? #rx&quot;^[a-z].*[a-z]$&quot; str) ↓)<br>
&gt;&gt;      (string-append &quot;*&quot; str &quot;*&quot;))<br>
&gt;&gt;<br>
&gt;&gt; where you can read `↑&#39; as &quot;the above&quot; and `↓&#39; as &quot;the below&quot;.<br>
&gt;<br>
&gt;<br>
&gt; It seems like `↑&#39; is another way to not name expressions (i.e. a &quot;pointless style&quot; :D), and `↓&#39; is handled just fine by internal definitions. This is equivalent, currently defined, has less nesting, and avoids a rename:<br>


&gt;<br>
&gt;   (define orig-str &quot;foo bar baz&quot;)<br>
&gt;   (define sub (substring orig-str 3 8))<br>
&gt;   (define str (string-trim sub))<br>
&gt;   (define m (regexp-match? #rx&quot;^[a-z].*[a-z]$&quot; str))<br>
&gt;   (and m (string-append &quot;*&quot; str &quot;*&quot;))<br>
&gt;<br>
&gt; A `define*&#39; form like Jay (and I) want would make these kinds of things less error-prone and allow names to be reused:<br>
&gt;<br>
&gt;   (define* ↑ &quot;foo bar baz&quot;)<br>
&gt;   (define* ↑ (substring ↑ 3 8))<br>
&gt;   (define* str (string-trim ↑))<br>
&gt;   (define* ↑ (regexp-match? #rx&quot;^[a-z].*[a-z]$&quot; str))<br>
&gt;   (and ↑ (string-append &quot;*&quot; str &quot;*&quot;))<br>
&gt;<br>
&gt; It&#39;s still pretty wordy, though. Even if I had `define*&#39; I&#39;d be tempted to go with my current favorite idiom, which trades wordiness for a nesting level:<br>
&gt;<br>
&gt; (let* ([↑    &quot;foo bar baz&quot;]<br>
&gt;       [↑    (substring ↑ 3 8)]<br>
&gt;       [str  (string-trim ↑)]<br>
&gt;       [↑    (regexp-match? #rx&quot;^[a-z].*[a-z]$&quot; str)])<br>
&gt;  (and ↑ (string-append &quot;*&quot; str &quot;*&quot;)))<br>
&gt;<br>
&gt; I occasionally get annoyed by how deeply these can get nested. I feel your pain, man.<br>
&gt;<br>
&gt; Neil ⊥<br>
&gt;<br>
&gt; _________________________<br>
&gt;  Racket Developers list:<br>
&gt;  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
</p>
</blockquote></div>