> I'd say lambda expressions are more of a defining characteristic of functional > languages. I think that the distinction between procedural and functional languages has become less important than it used to be. Procedural languages/programmers used to depend heavily on global variables and gotos. Some languages didn't even support recursion. Today, through the evolution of languages and "good programming style" the procedural languages have become "more functional", to the extent where it even may be hard to tell whether a language is functional or not. I would say the two remaining distinguishing characterstics for a functional language are: (1) discourage side effects No feature complete language is really free from side effects, since you can't do I/O or draw to the screen without them. (Unless you employ a contorted definition of what a "side effect" is.) But functional languages try to keep their side effects in check and not letting them roam free. (2) functions as first class values You can write a function that takes a function and returns a new modified function with reasonable syntax. C fails on both accounts. In C++ you can sort of do (2) with templates, but that fails the "reasonable syntax" test. Ruby, and indeed all object-oriented languages, fail (1) since the main thing they do is to pass around mutable objects. (2) is a bit harder to call. But I would say Ruby fails this too. Mainly because of the fact that "methods" have a different calling syntax than "method objects" and "procs". So I wouldn't say that Ruby is a functional language. // Niklas