Separating syntax and semantics
However, the natives were growing restless, and there were rumors of some new and attractive languages in town, namely Ruby and Python. I had written off both as non curly-brace languages when I first looked into them a while back, but somehow they kept creeping back into my peripheral vision.
Finally, I dug into Ruby.
For whatever reason, the difference in syntax was enough to force me to think about the fundamental meaning behind what I was writing in code. More specifically, meaning in a sense that was abstract from the language itself, since the language was foreign but the underlying concepts were familiar. Previously I would be tempted to map the concept one-to-one with C# or Java, but the difference in syntax forced me to think a little extra.
Ideally, the syntax should become transparent. I haven’t reached this point yet though, except maybe in C#. The problem is that my knowledge of C# is heavily entangled with my knowledge of the .NET platform, so in essence, the very definition of mixing syntax and semantics. One of the main goals I have with learning languages such as Ruby and Lisp is to break the cognitive habits that build up over time in dealing with a single class of language in most of your work.