Over at desperately unenterprise there is a nice article about the things the author dislikes about haskell, and an invitation to share your own quirks about your favourite language. Well, I almost equally like ruby and python. so here is a double rant.
Why ruby sucks
First, i can reopen classes but so can the others. It's all nice, and the usual idea that this will make development impossible is dumb, but it's true that it can get annoying. Matz once used to say this could be fixed by namespaces in ruby2 but I haven't heard anything about it in years and I'm not sure it will happen. Meanwhile, I still got the occasional oh, damn why isn't this working? moments, and it sucks. People may remember that nice chainsaw infanticide logger maneuver.
Modules as namespaces also suck. They rely on a wrong assumption, that everyone else will use modules as namespaces, which of course is not always true, so if you happen to use something poorly designed you may end hupo with their
User class conflicting with your.
Python got it right, namespaces are implicitly defined by files/directories and you have to explicitly import stuff in the current one.
But not just that, you can also import a single name from a python module. Try that with ruby's
require if you can. You're either forced to split every single method in it's own file, like facets does or you impose on the end user namespace pollution.
And it's not even that namespaces are cheap to define. The usual way is
- create a
- create a
- create many
- in every single file define the module
And it gets much worse with nested namespaces. And yeah I know I can do
class Module::ClassNameexcept that then I can't load that single file separately.
(I also dislike the thing about constants being lexically scoped to be fair, but probably it's just my disliking of class variables and the fact that I'd like to use constants for that)
What is nice about ruby modules is their usage as mixins, and even though I'd like them a bit different they are cool. But so under used.
The core classes in ruby are so fat that they are almost impossible to subclass.
Have you ever tried subclassing
String so that you can, for instance have a
TextileString where you can do substitution without considering the markup?
You'll never get it right enough, just
String# has 7 different behaviors depending on th arguments, and
String#= has 8 of them.
Comparable mixin rocks, everybody loves
Enumerable but go figure how to make an Hash-like or File-like object without subclassing
Why python sucks
The problems with python are, well, what makes it pythonesque.
Yeah, I understand why you need to explicitly define
self in a function, I just believe it's dumb and too verbose. But why can't I have a bit of syntax sugar ? Make
.foo be a shortcut for
At least that would also enforce the convention!
Python has such a big set of conventions that are not supported by the language. Do not use global variables, but look, there is a useful
global keyword, even though you have nested namespaces.
On the other hand, it enforces some ugly conventions, suchs as the avoidance of assignments in conditionals by splitting statements and expressions.
That distinction is so annoying that as time passes more and more things become both. Conditions are statements, so here is also the expression version. Functions are statements so here is the crippled lambda expression. Assignment is a statement so here are a handful of setters that avoid using the evil
update: sorry, this got published by error, it was still largely incomplete, so I'll juust add some more comments
A lot of things that I dislike are in the "kernel library" design, and not syntax. len, map and so do not make the language less OO, I know, but they are ugly and polluting the top namespace, why can't they be made part of proper abstractions? And I hate not being able to use mutable values as key for dictionaries, even java manages to do that, it should not be that hard.
Something that I miss syntax wise instead is the lack of a case statemente, especially of a destructuring/pattern matching one. Python people will usually tell you that you just use a dictionary. Yeah, but why I have to? I can remove else-if from the language too, but it does not mean it makes sense. case/switch statements are actually a place where the language can provide very useful behaviours once someone get past the C/Java versions of it. Take a look at ruby, SML or Scala.
And, pet peeve: why I have to type ":" in definitions? the parser does not need that, and come on, it adds nothing readibility-wise.