对于交互式会话,在定义 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