On Nov 15, 2011, at 11:50 PM, Jordan Schatz wrote: > From Racket v5.2 release notes: > >> Internal-definition expansion has changed to use let* semantics for >> sequences that contain no back references. This change removes a >> performance penalty for using internal definitions instead of let in >> common cases, and it only changes the meaning of programs that capture >> continuations in internal definitions. Internal definitions are now >> considered preferable in style to let. > > I'm not sure that I understand, but if I have it figured out then this: > > (define (foo x) > (local [(define i 10) > (define j 12)] > (+ x i j))) > > Is now considered better style then this? > > (define (foo2 x) > (let ([i 10] > [j 12]) > (+ x i j))) > > Why?
Your question suggests that you come from a teaching language background where we introduce only local definitions. In ISL and ISL+lambda, the use of local makes it easier to move global transformations into a local scope and vice versa. Most importantly, these movement preserve the exact semantics of the definitions, including errors. An *internal* definition differs slightly from a local definition in syntax and *semantics*: (define (foo x) (define i 10) (define j 12) (+ i j x)) It's preferable to local defines for aesthetic reasons because it consumes less horizontal space (a smaller indentation). -- Matthias _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users