All computer languages stink. Some stink less than others.

It is a predictable pattern:

  1. I meet a new language.
  2. I become infatuated with it.
  3. I become disenchanted with it.

I think I have reasonable expectations. A language (and/or its development environment) should be able to:

  1. Use a Windows COM/ActiveX/OLE object via dynamic dispatch.  Visual Basic version 5 is the gold standandard, against which others will be compared.
  2. Call a routine written in C (static linked and dynamic or shared-library).
  3. Parse an XML tree containing thousands of complex records in a few seconds.
  4. Provide list comprehensions.
  5. Support functional programming (including tail recursion optimization).
  6. Have a first-rate debugger. At a minimum, I want single click (or keyed-in command) to set a breakpoint, run-to-breakpoint, step-into and step-over, view content of a variable.
  7. Support working at a high level of abstraction. (i.e. Be highly expressive.)
  8. Serve dynamic web pages from data in any one of the popular SQL databases.
  9. Run on Win32 and Linux.
  10. Support code editing during a debug session to the level provided by Visual Basic 5.

What I don't like about:

  1. Erlang - they retired the interface to OLE/COM/ActiveX (Comet). I use Windows (in addition to other platforms). You can get Comet to work if you don't mind tinkering with the code to support the revised native interface. They say that its type system prevents errors. What I see is that, in order to get any real work done, you end up passing lists of tuples around, and those lists get interpreted on-the-fly, leading to typos in atom names not getting resolved until runtime. The development environment is pretty rudimentary; Erlide, Erlyweb, and Emacs; only Emacs supports debugging (via Distel) and I don't need to get "Emacs pinky."
  2. Ruby - beautiful language; slow execution; threading doesn't actually run parallel due to global interpreter lock; you really must do test-driven development, because it is really hard to write bug-free code with almost nothing checked at compile-time. Also, error messages tend to give the last line in the file as the source of the error, without regard for where the syntax error really happened. (Is this an artifact of having such flexible syntax?) I'm not too enthused about investing a lot of effort in becoming expert in a language that depends upon one man for its definition.
  3. Python - Comparable to Ruby in power; the infrastructure is more mature than Ruby. In principle, I like indentation better than "end" or "}" for marking the end of a block because it is more succinct; in practice, I'm constantly nervous that a tab character snuck into my code, or that something 83 lines earlier got indented by 5 spaces instead of 4. (You know, I'd like an editor that converts leading spaces into 4-column tabs; the oposite of what most editors do, in converting tabs into spaces. That way I could be sure that I didn't accidentally get 3 or 5 spaces when I meant 4.) While I have nothing against Guido personally (never having met the guy), when I read his pronouncements about Python, I do hear the Dictator in BDFL (Benign Dictator For Life). Contrast this with Matz ruminations, which are pretty hard to get upset over. ("Do it this way, the correct way," versus, "Do it the way that that brings you joy." I'm not too enthused about investing a lot of effort in becoming expert in a language that depends upon one man for its definition, although Google might hold things together if Guido were in a car wreck.
  4. SmallTalk -- Remind me why I didn't like SmallTalk? Was it the whole image thing? Would that be OK if I just drank the Kool-aid? Avi seems like a pretty smart guy. (I've not met him, but we did exchange email, and Seaside is pretty slick -- even if it did take me a while to wrap my mind around it.) Small syntax is good. I still love Pascal's one-page syntax chart. (Pascal from Jensen and Wirth's second report -- not Delphi or Free Pascal.) It is almost as slow as Ruby. It doesn't appear to make use of multiple-core CPUs.

<hr width="100%" size="2" /><hr width="100%" size="2" />
<ul><li>Free Pascal</li><li>OCaml<ul><li>COM via</li><li>OCSIGEN provides web application framework
</li></ul></li><li>Lua<ul><li>COM via LuaCOM</li><li>Web Application framework is Kepler (Xavante helps deploy in Windows)
</li></ul></li><li>GHC<ul><li>COM via HaskellScript</li><li>Testing (ala test-o-matic) via QuickCheck</li><li>HAppS provides web application framework</li><li>I built HAppS. It doesn't look like Haskell has a package manager, so I had to fetch dependencies based on error messags from "runhaskell Setup.hs configure". The good news is that configure/(fetch/build-fetched/install-fetched/)repeat/build/install, worked smoothly, and the resulting system ran a HelloWorld app without any errors or surprises. </li></ul></li><li>Scala(JVM)<ul><li>COM via Java via JACOB </li></ul></li><li>Java<ul><li>COM via JACOB</li></ul></li><li>Python<ul><li>pywin32</li></ul></li><li>Ruby<ul><li>win32</li></ul></li><li>Groovy<ul><li>COM via Scriptom (layered on top of JACOB)
</li></ul></li><li>C++<ul><li>COM native access
</li></ul></li><li>SBCL<ul><li>COM is apparently unavailable
</li></ul></li><li>Erlang<ul><li>COM via Comet (which is obsolete and doesn't work with current Erlarg without rework)</li></ul></li></ul>