setq
实际上,几乎总是对set
的第一个参数加引号。set
和引用的第一个参数的组合是如此常见,以至于它有自己的名称:特殊形式setq
。这个特殊形式与set
几乎相同,只是第一个参数被setq
自动引用,因此您不需要自己输入引号。此外,作为额外的便利,setq
允许您在一个表达式中设置多个不同的变量为不同的值。
为了使用setq
将变量carnivores
的值设置为列表'(lion tiger leopard)
,可以使用以下表达式:
(setq carnivores '(lion tiger leopard))
这与使用set
完全相同,只是setq
自动引用了第一个参数。(setq
中的‘q’表示quote
。)
使用set
,表达式如下:
(set 'carnivores '(lion tiger leopard))
此外,setq
还可以用于为不同的变量分配不同的值。第一个参数绑定到第二个参数的值,第三个参数绑定到第四个参数的值,依此类推。例如,您可以使用以下表达式将树的列表分配给符号trees
,将食草动物的列表分配给符号herbivores
:
(setq trees '(pine fir oak maple) herbivores '(gazelle antelope zebra))
(表达式同样可以在一行上,但它可能不适合一页;并且人们更容易阅读格式良好的列表。)
尽管我一直在使用术语“分配”,但还有一种理解set
和setq
运作方式的方式;即set
和setq
使符号指向列表。这种思考方式非常常见,在接下来的章节中,我们将至少遇到一个其名称中包含“指针”的符号。之所以选择这个名称,是因为符号有一个值,具体来说是一个列表,与之相关联;或者,换句话说,该符号被设置为指向该列表。