<div dir="ltr">Yes, expanding to let* will indeed be better for the optimizer. The optimizer, IIRC, currently uses a "You using set!? I give up" approach, and if you ever mention set!-ing the variable, the compiler will then insert typechecks every time the variable is used, slowing down things, and also box anything stored in it. While if a variable is not assigned to, usages of it do not need to check its type over and over. At least that's what I understood.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 19, 2015 at 3:07 PM, Alexander D. Knauth <span dir="ltr"><<a href="mailto:alexander@knauth.org" target="_blank">alexander@knauth.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Because of this: <a href="http://docs.racket-lang.org/guide/set_.html#%28part._using-set%21%29" target="_blank">http://docs.racket-lang.org/guide/set_.html#%28part._using-set%21%29</a><br>
Would this be better:<br>
(thread-through x e …)<br>
==<br>
(let* ([x e] …) x)<br>
<div class="HOEnZb"><div class="h5"><br>
On Feb 19, 2015, at 1:37 PM, Matthias Felleisen <<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>> wrote:<br>
<br>
><br>
> I recommend a macro for these situations, it's almost always what you want:<br>
><br>
> (thread-through x e_0 e ...)<br>
> ==<br>
> (let ([x e_0])<br>
>  (set! x e)<br>
>  ...<br>
>  x)<br>
><br>
> (you can also use let* here).<br>
><br>
> This brings across what you're really doing.<br>
><br>
><br>
><br>
> On Feb 19, 2015, at 1:32 PM, Jens Axel Søgaard <<a href="mailto:jensaxel@soegaard.net">jensaxel@soegaard.net</a>> wrote:<br>
><br>
>> We have let and let*, but only define. I miss define* at times.<br>
>><br>
>> This is an error:<br>
>><br>
>>   (block<br>
>>     (define x 4)<br>
>>     (define x (+ x 1))<br>
>>     (+ x 2))<br>
>><br>
>> With a define* it becomes:<br>
>><br>
>>   (block<br>
>>     (define x 4)<br>
>>     (define* x (+ x 1))<br>
>>     (+ x 2))<br>
>><br>
>> which (should) expand to:<br>
>><br>
>>   (block<br>
>>     (define x 4)<br>
>>     (block<br>
>>       (define x (+ x 1))<br>
>>       (+ x 2)))<br>
>><br>
>> /Jens Axel<br>
>><br>
>> 2015-02-19 19:24 GMT+01:00 Laurent <<a href="mailto:laurent.orseau@gmail.com">laurent.orseau@gmail.com</a>>:<br>
>>> But in such situations you can be vicious and abuse `let` to have your<br>
>>> `define`s:<br>
>>> (let ()<br>
>>> (define x 3)<br>
>>> (define y 4)<br>
>>> (list x y))<br>
>>><br>
>>> It's even more vicious if you use `let*` instead of `let`, but quite less if<br>
>>> you use `begin` instead ;)<br>
>>><br>
>>><br>
>>><br>
>>> On Thu, Feb 19, 2015 at 5:49 PM, Matthias Felleisen <<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>><br>
>>> wrote:<br>
>>>><br>
>>>><br>
>>>> In some places, you are allowed only one expression, and for that<br>
>>>> situation, you need let*.<br>
>>>><br>
>>>><br>
>>>> On Feb 19, 2015, at 12:40 PM, Don Green <<a href="mailto:infodeveloperdon@gmail.com">infodeveloperdon@gmail.com</a>><br>
>>>> wrote:<br>
>>>><br>
>>>>> What is/are the reason(s) for choosing the 'let*' construct over the<br>
>>>>> '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>
>>>>> ____________________<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>
>>><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>
>>><br>
>><br>
>><br>
>><br>
>> --<br>
>> --<br>
>> Jens Axel Søgaard<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>
<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>
</div></div></blockquote></div><br></div>