<div dir="ltr">But in such situations you can be vicious and abuse `let` to have your `define`s:<div>(let ()</div><div>  (define x 3)</div><div>  (define y 4)</div><div>  (list x y))</div><div><br></div><div>It's even more vicious if you use `let*` instead of `let`, but quite less if you use `begin` instead ;)</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 19, 2015 at 5:49 PM, Matthias Felleisen <span dir="ltr"><<a href="mailto:matthias@ccs.neu.edu" target="_blank">matthias@ccs.neu.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
In some places, you are allowed only one expression, and for that situation, you need let*.<br>
<div><div class="h5"><br>
<br>
On Feb 19, 2015, at 12:40 PM, Don Green <<a href="mailto:infodeveloperdon@gmail.com">infodeveloperdon@gmail.com</a>> wrote:<br>
<br>
> What is/are the reason(s) for choosing the 'let*' construct over the 'define' construct?<br>
><br>
> (define (print-two f)<br>
>   (let* ([_ (print (first f))]<br>
>          [f (rest f)]<br>
>          [_ (print (first f))]<br>
>          [f (rest f)])<br>
>     f))<br>
><br>
> (define print-two<br>
>   (lambda (f)<br>
>    (print (first f))<br>
>    (set! f (rest f))<br>
>    (print (first f))<br>
>    (set! f (rest f))<br>
>    f))<br>
><br>
> (void (print-two '(1 2))) ;=> 12<br>
><br>
</div></div>> ____________________<br>
>  Racket Users list:<br>
>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div><br></div>