Genius is a little strong in my opinion. Still an intelligent and talent man I'm sure.
In my opinion he has made some questionable decisions with Clojure.
- Gratuitous use of [] in some forms; mainly defn and let. Why break the homonicity so often for no real benefit?
- Comment strings appearing before argument lists in functions. I would like to see the entire protocol, name and args, before reading the docstring which may refer to the args.
"- Comment strings appearing before argument lists in
functions. I would like to see the entire protocol,
name and args, before reading the docstring which may
refer to the args."
I think writing one doc string for a multivariate function is better than having to write one for many. Check out clojure core's min function:
(defn ^number min
"Returns the least of the nums."
([x] x)
([x y] (cljs.core/min x y))
([x y & more]
(reduce min (cljs.core/min x y) more)))
So there are occasions for this related to efficiency. Where would you prefer the docstring?
Clojure code is surprisingly hard to edit for a Lisp-like language. The gratuitous use of square brackets where a Lisp would just use parentheses is part of that.
Omitting the parentheses inside those square brackets, however, was an even worse decision wrt editability. When you can't edit a sequence of syntactically homogenous items by simple s-expression manipulations, your Lisp's design is defective.
I see your point, I think you may downvoted because you did not elaborate rather than just say "you're wrong".
Let me see if I can elaborate on what I think you mean. Homoiconic can be interpreted as meaning that the programs structure is similar to it's internal representation and so then it can be argued that an argument list is implemented as a vector and so should be represented as such.
But I would suggestion that this is an implementation detail and would hazard that many Lisp implementation might share this implementation strategy. I suppose I should have described it as something along the lines of needlessly breaking with Lisp syntax traditions.
As an aside the reader macros themselves are not the problem as lists are not a one size fits all data structure within current computing so there is a need for vectors and hash maps etc.
YMMV, but it's interesting to note that some of these decisions are interrelated: [] and {} are implemented at the reader level and the reader isn't (very) extensible. This makes implementing defn (and by extension a user macro like it) much easier. The same is true of putting the sparring first.
The other thing with the docstring, of course, is that Rich made the decision to only have one docstring on an overloaded function. The docstring/arg order falls straight out of that. OTOH if you've read the docs for "map" recently you may be wondering if that was such a smart decision. For better or for worse, muti-arity overloading that doesn't just do partial application is a big part of modern Clojure.