[racket] Why choose the 'let*' construct over the 'define' construct when both can have sequential scope?

From: Eric Dong (yd2dong at uwaterloo.ca)
Date: Fri Feb 20 08:44:24 EST 2015

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.

On Thu, Feb 19, 2015 at 3:07 PM, Alexander D. Knauth <alexander at knauth.org>
wrote:

> Because of this:
> http://docs.racket-lang.org/guide/set_.html#%28part._using-set%21%29
> Would this be better:
> (thread-through x e …)
> ==
> (let* ([x e] …) x)
>
> On Feb 19, 2015, at 1:37 PM, Matthias Felleisen <matthias at ccs.neu.edu>
> wrote:
>
> >
> > I recommend a macro for these situations, it's almost always what you
> want:
> >
> > (thread-through x e_0 e ...)
> > ==
> > (let ([x e_0])
> >  (set! x e)
> >  ...
> >  x)
> >
> > (you can also use let* here).
> >
> > This brings across what you're really doing.
> >
> >
> >
> > On Feb 19, 2015, at 1:32 PM, Jens Axel Søgaard <jensaxel at soegaard.net>
> wrote:
> >
> >> We have let and let*, but only define. I miss define* at times.
> >>
> >> This is an error:
> >>
> >>   (block
> >>     (define x 4)
> >>     (define x (+ x 1))
> >>     (+ x 2))
> >>
> >> With a define* it becomes:
> >>
> >>   (block
> >>     (define x 4)
> >>     (define* x (+ x 1))
> >>     (+ x 2))
> >>
> >> which (should) expand to:
> >>
> >>   (block
> >>     (define x 4)
> >>     (block
> >>       (define x (+ x 1))
> >>       (+ x 2)))
> >>
> >> /Jens Axel
> >>
> >> 2015-02-19 19:24 GMT+01:00 Laurent <laurent.orseau at gmail.com>:
> >>> But in such situations you can be vicious and abuse `let` to have your
> >>> `define`s:
> >>> (let ()
> >>> (define x 3)
> >>> (define y 4)
> >>> (list x y))
> >>>
> >>> It's even more vicious if you use `let*` instead of `let`, but quite
> less if
> >>> you use `begin` instead ;)
> >>>
> >>>
> >>>
> >>> On Thu, Feb 19, 2015 at 5:49 PM, Matthias Felleisen <
> matthias at ccs.neu.edu>
> >>> wrote:
> >>>>
> >>>>
> >>>> In some places, you are allowed only one expression, and for that
> >>>> situation, you need let*.
> >>>>
> >>>>
> >>>> On Feb 19, 2015, at 12:40 PM, Don Green <infodeveloperdon at gmail.com>
> >>>> wrote:
> >>>>
> >>>>> What is/are the reason(s) for choosing the 'let*' construct over the
> >>>>> 'define' construct?
> >>>>>
> >>>>> (define (print-two f)
> >>>>> (let* ([_ (print (first f))]
> >>>>>        [f (rest f)]
> >>>>>        [_ (print (first f))]
> >>>>>        [f (rest f)])
> >>>>>   f))
> >>>>>
> >>>>> (define print-two
> >>>>> (lambda (f)
> >>>>>  (print (first f))
> >>>>>  (set! f (rest f))
> >>>>>  (print (first f))
> >>>>>  (set! f (rest f))
> >>>>>  f))
> >>>>>
> >>>>> (void (print-two '(1 2))) ;=> 12
> >>>>>
> >>>>> ____________________
> >>>>> Racket Users list:
> >>>>> http://lists.racket-lang.org/users
> >>>>
> >>>>
> >>>> ____________________
> >>>> Racket Users list:
> >>>> http://lists.racket-lang.org/users
> >>>
> >>>
> >>>
> >>> ____________________
> >>> Racket Users list:
> >>> http://lists.racket-lang.org/users
> >>>
> >>
> >>
> >>
> >> --
> >> --
> >> Jens Axel Søgaard
> >
> >
> > ____________________
> >  Racket Users list:
> >  http://lists.racket-lang.org/users
>
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20150220/798b0082/attachment.html>

Posted on the users mailing list.