> 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