I’m certainly not the first to do this, but I felt like writing it. Comparing Ruby and Common Lisp:
Syntax: Advantage, Common Lisp. No contest here. Ruby’s syntax is ugly, with all those end
s hanging around and the { |var| ... }
block syntax. The one thing Ruby has going for it is conciseness. The block syntax, ugly though it may be, is shorter than (lambda (var) ...)
, which may explain why Ruby uses blocks everywhere while CL programmers go out of their way to avoid lambdas.
Libraries: Advantage, Ruby. CL has some really interesting high-level libraries, but it’s lacking in bread-and-butter utilities like date/time, file handling, and string munging.
Speed: Everybody knows Ruby is slow. CL with native compilation is not. On the other hand, a lot of Ruby libraries are written in hand-optimized C, so they’re plenty fast. But just try to decipher that C code when you want to modify the behavior of a library. Slight advantage, CL.
Resource usage: Slight advantage, Ruby. Most CL implementations carry the baggage of a 20MB runtime. Ruby by itself is small, but some major libraries (e.g. Rails) are memory hogs.
Web development: Advantage, Ruby. Rails rocks. The CL web frameworks are complex and not well tested in mainstream production use.
Testing: Dead heat. Both languages have several excellent testing frameworks. There’s been some particularly innovative work on Behavior-Driven Development in Ruby with rSpec.
Metaprogramming: Advantage, CL. Although Ruby is famous for its metaprogramming abilities, it can’t compete with CL’s macro system and the Meta-Object Protocol. I find the Ruby metaprogramming methods confusing, so I fall back on evaluating template strings, which is error-prone.
Difficulty: Ruby is definitely easier to learn, especially for someone with some C/Perl background. Common Lisp is really different, and shows its age in areas like file handling.
Code organization: This can’t be quantified, but I find it easier to structure my code in Ruby. Knowing at the outset that everything will go into classes and methods makes it more obvious how code is divided up. Lisp code, the “big ball of mud” as some call it, grows more organically but leaves me with a disorganized mess of individual functions scattered across a bunch of source files. I think writing well-organized code in Common Lisp requires more discipline and attention to detail than it does in a class-oriented language like Ruby.
Conclusion: Both languages have their problems. I feel more affection for Common Lisp, and I’m glad I learned it, but Ruby will probably continue to be my primary working language for a while. If I were starting something really unique that I would have to build from the ground up, Lisp would be my choice. But for building dynamic web sites, Ruby gets the job done right now. I hope Ruby will continue to evolve in a Lispy direction, with an abstract syntax tree and a macro system. Throw in an optimizing compiler and it might almost be perfect.
Which CL programmers go out of their way to avoid lambda?
I took umbrage Syntax lambda comment as well. In addition to that I think you’ve misrepresented the Common Lisp libraries situation as well. There are several good date/time libraries for Common Lisp. e.g. http://common-lisp.net/project/cl-date-calc/ and http://common-lisp.net/project/local-time/
I don’t find any problems handling files in Common Lisp. What were you referring to there?
I was surprised to see string munging listed as well. There are plenty of great libraries for string manipulation. e.g. http://weitz.de/cl-ppcre/ (Perl compatible regular expressions which out perform Perl), http://www.geocities.com/mparker762/clawk.html#clawk (Unix Awk in Common Lisp), http://weitz.de/cl-interpol/ (string interpolation like Ruby’s “#{foo}” syntax).
Try the “Text Processing” tag at The Common Lisp Directory — http://www.cl-user.net/asp/tags/11032