%% > Game over, if Java or Ruby provides native compilation; it won't make
%% > sense to code with anything else.
%%
%% I humbly disagree.  While Java and Ruby are very good general-purpose
%% languages, I think that there's still a place for more specialized
%% languages to solve particular problems, even if it's just for
%% prototyping.  I've found that languages like OCaml and Haskell are
%% excellent for prototyping problems involving complex data structures,
%% and give you new and better insights into how the problems might be
%% solved.  Result: you have cleaner, more elegant code that's easier to
%% understand and maintain, once you go from your prototype to the actual
%% design in the target language.  If for nothing else but increasing
%% mental flexibility, other languages are useful.
%%
%% --
%% Rafael R. Sevilla <dido at imperium dot ph>	+63(2)8123151
%% Software Developer, Imperium Technology Inc.	+63(917)4458925
%%

I agree with Rafael. Java and Ruby are primarily OO languages,
paradigmatically speaking. While OO has clear and obvious benefits over
other paradigms for particular sets of problems, it is often the hammer that
makes every problem a nail in computer science these days.

As OO languages go, I think Ruby's dynamic ObjectSpace adds an interesting
set of capabilities to the programmers abstraction-construction toolchest
(so to speak), particularly in terms of metaprogramming. I definitely like
it more than Java, for that reason.

However, I am a supporter of exploring other paradigms. Ocaml and Haskell,
mentioned above, are indeed interesting and quite powerful in their domains.
Another, somewhat more obscure, language that I have a certain affection for
is Mozart-Oz, which supports not one, not two, but no less than FIVE
computational paradigms, all in the same very efficient kernel language.
Like Java, Oz compiles to cross-platform bytecode. But unlike Java, it's
network concurrency is entirely transparent to the programmer, and Oz
"fuctors" (or components) are free to use any paradigm internally that gets
the job done. Is your problem a constraints problem? Use the declarative
aspects of the kernel language, a la prolog. Is the problem more simply
modelled after human real-world abstractions? Then use OO, complete with all
the trappings thereof (inheritance, encapsulation, polymorphism, etc.). Is
your problem computationally expensive? Then use the functional subset of
the kernel language, a la Haskell. Its really an amazing feat in computer
science to have combined the paradigms as cleanly as completely as they (the
Mozart consortium folks) have.

If it interests you at all, check them out at www.mozart-oz.org.

Now for day-to-day practical problems I find that Ruby more than suffices
for just about everything, and I'm in love with its extensibility. I'm
working on some exciting packages for the Ruby community, and I want to see
this community -- and the language -- grow. In fact, I'd say I'm personally
committed to that goal.

But there is something to be said for the multiparadigm approach, whether
you achieve that by blending components written in different languages (and
.NET doesn't really count here, since all .NET langauges share the same
fundamental OO semantics, via the CLR), or you use one language that
supports all of them. For some problem domains, strictly OO methodology is
not the optimal approach.

So - that's all I have to say about that.

Back to Ruby coding... :)

Sincerely,

Bob Calco