On Tue, Sep 7, 2010 at 8:57 AM, Eli Barzilay <e...@barzilay.org> wrote: > At some point after the Racket rename, `racket/nest' was dropped, and > every once in a while I run into a case where I really miss it. So > here's a shot at what went wrong and an alternative vesion. > > My guess is that the main thing that made it difficult to use is the > fact that it used the usual let-style grouping, which can be difficult > to follow when the forms in it are themselves using the same kind of > grouping. The result is a kind of code that encourages parenophobia: > > (nest ([let ([x 5])] > [let ([x (+ x x)])] > [for ([x (in-range x)])] > [when (even? x)]) > (printf "x = ~s\n" x)) > > At some point not too long ago, there was discussion of various tricks > people use to reduce such rightward drift. I remember one reader that > was starting a new parenthesized expression on every `/', so > > (a b / c d / e f) --reads-as--> (a b (c d (e f))) > > IIRC, Haskell also has a `$' thing with the purpose of doing just > this. > > So how about using a non-alphabetic name (reduces clutter that breaks > reading) and using it also for the separators instead of the > paren-of-parens thing that makes that mess? Using `$', it would look > like this: > > ($ let ([x 5]) > $ let ([x (+ x x)]) > $ for ([x (in-range x)]) > $ when (even? x) > (printf "x = ~s\n" x)) > > for the above expression. > > Opinions? > > -- > ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay: > http://barzilay.org/ Maze is Life!
FWIW, I think "nest" seems less like a macro to me and more like a reader syntax. It's like our period-based infix notation; it just shuffles around s-expressions syntactically, it doesn't mess with bindings or anything else to do with semantics of an expression. --Carl _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/dev