I like that the article was non judgement. The real world is messy and Common Lisp formalized existing practice among several branches of an already old language from before programming language theory. There are a number things worth “fixing” and it’s delightful that so much interest and implementation in this regard has been sustained for so long. But to the ideologues, I can only quote Emerson: "A foolish consiste…
For example:
> ... it is not at all strange that there is an object whose type is both list and symbol.
Actually, it is strange, and unfortunate. One should think about examples of code that might store different types of values in a variable or data structure, using e.g. `symbolp` and `listp` to distinguish the different representations, and consider how the collision between the symbol nil and empty list could produce unexpected behavior. One must be aware and remain vigilant.
> the things which are not necessary are that it be a symbol, and that it represent falsity.
Other non-necessary things: `car` and `cdr` special cases for `()`, self-evaluating `()`.
> CL requires precisely one implementationally-weird object, while Scheme requires two, or three if you count #t
There is nothing intrinsically weird about having an empty list object. The only thing weird about it is the behavior of `car`, `cdr`, and `symbolp` in CL.
Also, there is nothing weird about having a proper boolean type. On the other hand, if CL's `(type-of 't)` actually returns `boolean` and not `symbol`, as the article indicates, then that is indeed weird.