Для интерактивных сеансов нечувствительность к регистру использовалась по умолчанию при определении стандарта Common Lisp.
Но, что действительно происходит, так это то, что ридер Common Lisp преобразует все символы в верхний регистр перед тем, как их интернировать и оценивать. Это значение по умолчанию, но вы всегда можете изменить его, если хотите.
Объекты *readtable*
имеют атрибут readtable-case , который контролирует, как читатель интернирует и оценивает прочитанные символы. Вы можете setf readtable-case
до :upcase
(по умолчанию), :downcase
, :preserve
, :invert
.
По умолчанию readtable-case
установлен на :upcase
, что приводит к преобразованию всех символов в верхний регистр.
Если вам нужна чувствительность к регистру, вы должны сделать
(setf (readtable-case *readtable*) :invert)
=> :invert
На первый взгляд, вы можете подумать, что было бы лучше выбрать параметр: preserve, но у него есть небольшая проблема: все символы, как определено стандартом, должны быть переведены в верхний регистр. Таким образом, у вас будет чувствительность к регистру только для символов, определенных вами, и вам придется написать:
* (DEFUN hi () "Hi!")
=> hi
* (SETF a-number 5)
=> a-number
* (HI)
=> ;error: the stored function is #'HI in the *readtable*, but by
; calling (HI) you try to acces a function named #'hi(downcase), which
; gives an error
* A-NUMBER
=> ;error: same for the variable
* (hi)
=> "Hi!"
* a-number
=> 5
Параметр :downcase
противоположен значению по умолчанию, преобразуя все в нижний регистр, не давая чувствительности к регистру.
Но с :invert
символы, которые вы пишете в исходном коде, такие как defun
, setf
функция hi
, преобразуются в верхний регистр, и любой символ в CamelCase
сохраняется так, как будто он изначально :
* (setf (readtable-case *readtable*) :invert)
=> :invert
* (defun Hi () "Hi!")
=> Hi
* (Hi)
=> "Hi!"
* (eq 'Hi 'hi)
=> nil
* (eq 'HI 'hi)
=> nil
* (eq 'Hi 'Hi)
=> t