On Monday, March 11, 2019 at 1:13:30 PM UTC-4, Brian Adkins wrote: > > > > On Monday, March 11, 2019 at 12:29:40 PM UTC-4, Matthias Felleisen 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 >> >> > I want let semantics, but I've been using define more because it's > preferred in the Racket style guide. I don't want the behavior of define > above, so using letrec to get a runtime error instead of compile time error > doesn't make sense. >
Oops - I should've used let* in my example. -- 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.

