>
in that you can write "weird" expressionsOh, I see what you mean. I discovered Lisp after working in C++ and Java, so I avoided this pitfall in my code, but if I had a dollar for every instance of:
(let ((some-variable (progn
(do stuff)
(do other stuff)
(let ((some-helper-var ...))
(some more code with some-helper-var)
(more-of-the-same (progn
...)))
;; 50-100 lines later, just return one of the values
some-variable)
that I saw in Lisp codebases, particularly in Emacs, well... I could feed my family for a month or two from that money.
There's plenty of abuse potential here (and for the love of god, if your language has 'let', it probably also has lambdas or 'flet', use that to create local functions...). But mitigating this, arguably, is a problem for style guides - the overall feature of "everything is an expression" is powerful. It has nice simplicity to it, and reduces boilerplate :).
> Also, for low level languages, the mapping between code and assembly is clearer in languages that separate statements and expressions
I'm guessing this is where the separation originally came from. Assembly is essentially statement-only. But at this point, I think all programming languages in use crossed the threshold where we're actually programming to an "abstract machine", and being expression-oriented seems to confer greater expressiveness.
> (I need a more succinct term).
"Separatist"? :).
> EDIT: Also, by preventing statements from being used as expressions, you encourage breaking up long and complex statements into smaller functions.
Ah yes. The real debate. I edited my comment to mention it before I saw your edit :).