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 <[email protected]> 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 <[email protected]> > 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 <[email protected]> > 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 <[email protected]>: > >>> 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 < > [email protected]> > >>> 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 <[email protected]> > >>>> 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 >
____________________ Racket Users list: http://lists.racket-lang.org/users

