Clojure still uses S expressions, it just has more than just lists available. Square brackets don't make lists, they make vectors. Commas are always optional. I don't know what you mean by "arbitrary lists where pairs which belong together aren't grouped", but maybe you mean maps or sets, which are also not lists but a different data type.
The example that most typifies my issues with Clojure syntax is let-binding. In Lisp it's very clearly structured:
(let ((foo bar)
baz
(quux frob))
...)
In Clojure not only are the bindings unstructured, they are thrown into a vector. Not a list, not a map (for which Clojure has dedicated syntax, mind), a vector.
(let [foo bar baz quux frob]
...)
And that is one of the only two places I know of where Clojure arbitrarily uses a vector when it uses lists everywhere else:
Comments
Clojure still uses S expressions, it just has more than just lists available. Square brackets don't make lists, they make vectors. Commas are always optional. I don't know what you mean by "arbitrary lists where pairs which belong together aren't grouped", but maybe you mean maps or sets, which are also not lists but a different data type.
Different data types are used for different things. Vectors have more natural insertion behavior, so most people use them where that might happen.The example that most typifies my issues with Clojure syntax is let-binding. In Lisp it's very clearly structured:
In Clojure not only are the bindings unstructured, they are thrown into a vector. Not a list, not a map (for which Clojure has dedicated syntax, mind), a vector. And that is one of the only two places I know of where Clojure arbitrarily uses a vector when it uses lists everywhere else: Instead of either of: