It also doesn't bode well when a typical fragment of Lisp looks like:
(DEFUN VALID-RANGE (LIST) (IF (NUMBERP (CAR LIST)) (LET ((MIN (CAR LIST)) ;gets SETQed below (MAX (CAR LIST))) ;gets SETQed below (DO ((ELS (CDR LIST) (CDR ELS))) ((NULL ELS) (LIST MIN MAX)) (LET ((CAND (CAR ELS))) (COND ((NOT (NUMBERP CAND)) (RETURN 'INVALID)) ;; at most one of the next ;; two cases can occur. ((< CAND MIN) (SETQ MIN CAND)) ((> CAND MAX) (SETQ MAX CAND)))))) 'INVALID))
Someone well versed in Lisp would be able to see what that does (much like someone well versed in Perl would be able to tell what $data =~ m/^211\s+\d+\s+(\d+)\s+(\d+)\s/; does—maybe).
But after reading Paul Graham's article about using Lisp for web-based applications and hearing the remark that XML is nothing more than Lisp in drag, I figured it may be time to give Lisp another look.
The two major dialects of Lisp today are Scheme and Common Lisp. Since Scheme is conceptually simpler and cleaner than Common Lisp, I decided to give it a try. The MIT version requires one to already have the MIT version installed before you can install the MIT version (and that's another lovely feature about Lisp—recursion to an infinite degree (or until you run out of memory)).
Off to try Common Lisp.
Another thing I've come to realize is that Lisp, much like C++, accreted features over it's current 54 year history so quite a bit of arcana is needed to successfully write programs in it. Then again, the principles underlying Lisp are so simple that, like Forth, one can implement a Lisp system (functioning, if limited) in a few days of work so maybe that's the way I should proceed.