Lisp 和 Common Lisp 的一个特点是它没有运算符和复杂的运算符语法之类的东西。标识符都是符号。
符号由少量字符或空格分隔。例如右括号结束它之前的任何符号。
所以
((foo)bar)
和
((foo) bar)
读起来一样。
否则,其他字符(如 *、=、-、_、&、%、...)是符号的有效字符,即使没有转义。
CL-USER > '(*foo =foo -foo _foo &foo %foo)
(*FOO =FOO -FOO _FOO &FOO %FOO)
在实践中,您会看到类似上面的符号,但不会看到问题中提到的符号。
当读取表更改或数字输入更改时,它确实令人不安。
CL-USER 51 > (setf *read-base* 36)
36
CL-USER 52 > '(dear dad)
(625059 17221)
CL-USER 53 > (+ dear dad)
642280
甚至
CL-USER 54 > (|SETF| |*PRINT-BASE*| 10)
10
CL-USER 55 > (+ dear dad)
DRL4
另请注意,并非每个 Lisp 实现都允许使用关键字作为名称的函数:
CL-USER 1 > (defun :foo (a) (* a a))
Error: Defining function :FOO visible from package KEYWORD.
1 (continue) Define it anyway.
2 (abort) Return to level 0.
3 Return to top loop level 0.
Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.
CL-USER 2 : 1 >