A small but very vocal sub community of programmers hates semicolons. Really, semicolons are nice for readability and nice for your tools, as they make statement termination explicit. I was on the losing side (a semicolon lover) of this debate when it came to scala.
I think this is mostly bikeshedding, but I can't agree with your statement.
The claim is not that we shouldn't have explicit statement terminating characters. It's that we already have one - new lines - and that mandating semicolons is both redundant and bug prone.
Personally, and while it doesn't really affect my choice of languages, I think you should be able to use one or the other, but not two consecutively.
In any case, excuse me for posting this, and I promise I won't discuss it here any more.
Having an explicit terminator makes it maximally flexible, but certainly not "possible". Python does it just fine, but the rules, while mostly sensible, do have a couple of corner cases that can catch you. Javascript does it somewhat less fine, with quite a few more corner cases, including a couple that definitely routinely hit people. But in both cases, it can be done. Nor are those the only two examples.
I program in Python (no semicolons) and I also frequently split long statements over multiple lines. One doesn't need an explicit statement terminator to do it. You can do it inside parentheses for ex.
Is perfectly valid groovy, spread on multiple lines with no semicolons.
You seem to be making this out like its some huge inconvenience. It is very rarely an issue and its not like there are 5000 things you can't do. Its really just line breaks in statements that aren't delimited any other way that are effected and all you have to do it put the operator on the line prior to the break...
You're right about statements being expressions and returning the last executed expression. In fact, since using Clojure I've gotten used to these, e.g.
(-> (Foo 50) (Bar))
(def x (if (> i j) 5 6))
I do miss the static typing and more readable syntax, though, and have appreciated Haskell in this regard. Too bad things like powerful macros and convenient syntax don't seem to gel together well in the same language.
I have first hand experience that semicolons are good for tools. I've also helped people debug their Scala compilations by having them add semicolons on various lines to make the error messages more comprehensible.
If we didn't have multi-line statements, new lines would work great as statement terminators.
Isn't this part of a trend to reduce the presence of statements (enforcing order-based reasoning) ? With javascript ubiquity and mainstream presence of lexical closure people converge toward functional, encoding of patterns, even sequences.
I think you are right but I disagree with the trend. Debugging a wide horizontal expression is much harder than debugging a tall vertical sequence of statements.
I work in this area and I'm not so sure the fix will be easy. There seems to be a real "cognitive" cost to abstractions such as deep chains of combinators, which spills over into debugging. How the heck are you supposed to debug something when the control flow is abstracted N-layers deep? You really can't, which means you have to resort to something like data-flow debugging.