I'll give one reason why Python may be better for
team development than clojure/lisp: powerful macros. They do make it harder to reason about code you didn't write. In Python, you can look at the
inside of a function and have some idea what it is doing.
"It's doing kwyjibo(i,v) to all the i in zqmfgb. Now, lets see what v and zqmfgb are."
In clojure, that isn't always the case. An example: recently, I was trying to write an OpenGL app in Clojure. I found the following code on the net (pretend it was written by a team member):
(doto obj
(.glBegin ...)
(.methods ...)
(.glEnd))
I decided I wanted to factor out the (.glBegin ...) and (.glEnd). Aha, this is a job for macros!
(gl-begin-end body) ; this should macro expand to:
(do
(.glBegin ...)
body
(.glEnd))
This would just fit inside the the doto, and be exactly what we need. The problem is that doto significantly modifies it's contents:
(doto obj
(.method x)
(.method y))
(clojure.core/let [G__1206 obj]
(.method G__1206 x)
(.method G__1206 y) G__1206)
So I got this:
(doto obj
(gl-begin-end body))
;macroexpand once
(clojure.core/let [G_1725 obj]
(gl-begin-end obj body))
;macroexpand twice
(clojure.core/let [G_1725 obj]
(do
(.glBegin ...)
G_1725
body
(.glEnd)))
Obviously this didn't work.
In this case, the problem is me: `(doto obj body)` is idiomatic clojure, and I should have known about it. On the other hand, `(kwyjibo obj obj2 body)` could be very hard to figure out and modify.
I should, however, raise the caveat that I'm not a good enough lisp programmer to know if this is really a problem in practice.