[racket] Why choose the 'let*' construct over the 'define' construct when both can have sequential scope?
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