Topic: Lisp
One Common Lisp feature that needs more publicity is case sensitivity. A common misconception is that Common Lisp is case insensitive, when in fact symbols in Common Lisp are case sensitive.
By default, the Common Lisp reader is case-converting: all unescaped characters in a symbol name get upper-cased. This gives the practical effect of making it seem as though symbol case does not matter. This is desirable behavior for interfacing with other case-insensitive languages, such as Fortran (from what I understand the main motivation for the default Common Lisp behavior), but a pain to interface with case-sensitive ones, such as C.
The behavior of the reader can be customized via readtable-case.
The one that might seem to be most useful for having case-sensitive
symbols at first glance is :preserve
, however remember
that all code read in with the default setting (:upcase
)
is in upper-case, as are all the standard Common Lisp symbols (this is
defined by the standard), so this means you will need to spell out all
COMMON-LISP:
and external symbols IN ALL UPPERCASE. To
make this less annoying, the :invert
readtable-case is
the most practical - all-lowercase symbol names become uppercase,
all-uppercase become lowercase, and mixed-case stays mixed-case (the
important part for case sensitivity). The Lisp printer outputs symbol
names correctly this way by default. The only problem now becomes
inconsistent spelling of a symbol in all lowercase or all uppercase in
old code that expects case conversion. But otherwise you can get case
sensitivity for your software by setting readtable-case to
:invert
today.
An easy way to manage the readtable-case is by using the named-readtables library. I highly recommend named-readtables; besides case sensitivity, it also helps manage reader macros.
[This blog post is adapted from the case sensitivity CLiki FAQ entry I wrote. Feel free to make corrections and other suggestions on the CLiki page.]