Correction: it needs unbound variables, not lazy evaluation. Erlang doesn't have unbound variables; I suspect one would have to implement some form of that before implementing difference lists.
yeah, s-exprs are very hard, right? compared to bazillion new keywords that can't be used by user programs and various kinds of brackets for different purposes.
Nobody mentioned s-expressions, and there's more to lisp syntax than that. The s-expressions have to mean something, and it is at this level that usability is made or broken.
Scheme is beautiful, but it sacrifices usability for purity. Common Lisp, on the other hand, is usually held to be both "ugly" and "better for real work(tm)".
Here's a nice blog post that highlights the practicality issue with Scheme's design.
Dude, you completely missed the point of that post. It literally says in the second sentence that Scheme's numeric tower was borrowed from Common Lisp. The point is that if Scheme's numbers were like the rest of Scheme, they would be horribly impractical.
Some people find s-expressions hard to read because they are almost too uniform. Having different brackets and braces mean different things can aid those folks.
There are languages that allow user-defined syntax and aren't only parenthesis/s-expressions, so arguing one requires the other is a false dichotomy.
Often the information that different brackets and braces would represented in other languages becomes the shape of the s-expressions. I find that easier to parse than most[1] languages. With rainbow-delimiters[2] (example[3]), parsing nested parens becomes far easier.
In Racket and other Schemes parens and square brackets are interchangeable. The Racket style guide suggests to use square brackets in let- or cond-like expression, or generally any expression with a list of lists of fixed length that are not supposed to be evaluated. The expression you posted would become like this:
(do ([i 1 (+ i 1)])
((> i 100))
(display
(cond [(= 0 (modulo i 15)) "FizzBuzz"]
[(= 0 (modulo i 3)) "Fizz"]
[(= 0 (modulo i 5)) "Buzz"]
[else i]))
(newline))
I personally think this helps a lot with the problem of parsing s-expressions visually.