8.6 关键字 (Keywords)

keyword 包的符号 (称为关键字)有两个独特的性质:它们总是对自己求值,以及可以在任何地方引用它们,如 :x 而不是 keyword:x 。我们首次在 44 页 (译注: 3.10 小节)介绍关键字参数时, (member '(a) '((a) (z)) test: #'equal)(member '(a) '((a) (z)) :test #'equal) 读起来更自然。现在我们知道为什么第二个较别扭的形式才是对的。 test 前的冒号字首,是关键字的识别符。

为什么使用关键字而不用一般的符号?因为关键字在哪都可以存取。一个函数接受符号作为实参,应该要写成预期关键字的函数。举例来说,这个函数可以安全地在任何包里调用:

  1. (defun noise (animal)
  2. (case animal
  3. (:dog :woof)
  4. (:cat :meow)
  5. (:pig :oink)))

但如果是用一般符号写成的话,它只在被定义的包内正常工作,除非关键字也被导出了。