To be fair:

As a new user, it's possible to have the intuition that `define` is
just a way to avoid indentation -- that it "writes a `let` for you,
from the point of the define to 'the end of the enclosing scope'".

And it's possible for that intuition to seem correct for a very long
time -- until you hit an example like Brian did. And then you need to
learn about `letrec`.

(As a non-new user, 99.9% of the time that I use a local `define` I
actually wish it were "like `let`" not `letrec`, but I use it anyway
and try to be careful.)


On Mon, Mar 11, 2019 at 12:29 PM Matthias Felleisen
<[email protected]> wrote:
>
>
>
> > On Mar 11, 2019, at 11:21 AM, Brian Adkins <[email protected]> wrote:
> >
> > I just discovered that define will fail at runtime, where let would fail at 
> > compile time. Besides helping to keep the indentation level from marching 
> > to the right "too much", what are the benefits of define over let?
> >
> > --- snip ---
> > #lang racket
> >
> > (define (f n) (+ n 1))
> >
> > (define (foo)
> >   (define b (f a))
> >   (define a 7)
> >
> >   b)
> >
> > (define (bar)
> >   (let ([b (f a)]
> >         [a 7])
> >
> >     b))
> > --- snip ---
>
>
>
> I think your characterization is a bit misleading here.
>
> In ‘bar’ ‘a’ is not bound, something that Racket (and DrRacket) properly 
> signal at compile time.
>
> In ‘foo’ ‘a’ *is* bound, because you’ve set up a mutually recursive scope. 
> But, when Racket evaluates (foo) it notices that ‘a’ is bound but 
> uninitialized, which is two different things.
>
> If you want to compare apples to apples, use a ‘letrec' instead of a ‘let' in 
> ‘bar'. Then you have (1) the same semantics and (2) the same error.
>
> — Matthias
>
> --
> You received this message because you are subscribed to the Google Groups 
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to