As noted in my last post, I'm trying to pick a couple of new languages. I'm currently looking at python (not really new to me, but reactivating my knowledge of it), ruby, erlang and C#. Of those four, the one that's strangest to me is ruby - and I've been trying to pinpoint why.
Functions/methods I
Most of the languages I've used have had a pretty similar syntax for naming functions and for calling them. If you leave out assembly, then the typical format (in regex) is:
[a-zA-Z0-9_]
So, alphanumeric with possibility for underscores. Different languages have different conventions for function naming, though most conventions span languages, and it's just convention anyway. However, in ruby, function names can include some non-alphanumeric characters that you normally wouldn't see in a function name - that is, if you're used to php, javascript, c-like languages, python, etc.
So, sort! is a perfectly legal name in ruby. The exclamation point signifies that the method will change it's object in place. Similarly, ? can be used in function names - this normally signifies that the function will return a boolean value.
Neither symbol can be used other than at the end of function names - but still, it just throws me off. To me, ! and ? are operators, just like *, /, + and % are - they aren't part of names. That means I still see sort! as function + operator at first glance and only after thinking about it do I realize what it is.
Now, the funny thing is, I actually think it's a pretty good naming scheme - or, rather, I think it's a pretty great idea for an operator. For any function, just slap on ! to have it alter the first given parameter in-place instead of return a value. I doubt it would lead to bigger WTF-moments than realizing some schmuck named his function with a ! but it doesn't alter anything in-place (the ! is a convention, nothing more).
Functions/methods II
The other thing that's bugging me about ruby is the syntax for calling a function. Specifically, that function(parameter) and function parameter are both valid. Or, not that they're both valid, but that function parameter is valid and preferred (where not completely illegible). It does make sense that the interpreter will know the difference between a function and other properties/variables and thus will know if it should return the variable or call the function - however, the point is that to me it just looks like you're asking for a property or a variable. Leaving off the parentheses just makes it harder for me to figure out if you're calling a function or not - is [].sort a property (it's Danish for black) or a method?
Granted, sort is not likely to a big problem, but there are still a lot of ruby I don't know - having to guess doesn't make it any easier. And while I could obviously just stick to parentheses myself, I'm highly unlikely to never look at another persons code. If for no other reasons than because I am a fan of DRY.
Incidentally, ruby shares this coffeescript - and it bugs me there too. In fact, coffeescript suffers more from it, in my eyes, because there you can't distinguish between referencing a function that doesn't use parameters and calling the same. Hence, you either need to use parentheses in that case or a different construct to call functions without parameters. Either way, your clean scheme just got compromised.
Variable naming
Continuing from the previous section, ruby has another quirk/feature, that's to do with naming and syntax: to reference a global variable inside a class, you prefix it with a dollar-sign. This actually means the dollar-sign is syntax: without the dollar-sign, the variable won't be global. However, it is also naming: my_variable (in the global scope) and \$my_variable (in class scope) are not the same - even though my_variable in the global scope is exactly that, global!
In some ways, I expect this makes it easier to deal with: you see a name of a variable and you just take the entire string as the name - you don't have to consider if any of it is an operator or something else. But it does mean that if you're used to syntax as something different from what it's used on, then you'll be awfully confused.
Thoughts
I find it interesting that the biggest differences and stumbling blocks I see are in syntax. I might dislike what I see as anal retentiveness in Java and C++, but I understand it quite well and intuitively get it. With ruby I'm suddenly wondering: what exactly am I looking at? In that sense it makes it harder to pick up - at least for me. Then again, I do have some years experience staring at code, so it might also go the other way for beginners, seeing as ruby does come closer to English than most languages I have seen.
However, I also find that the things I stumble on are interesting and could make some things easier. I think what I'm mainly stumbling on is new syntax - a new way of doing things, which I'm not used to. And that's actually cool: having your eyes opened to different ways of doing things.