setq ¶要将符号 flowers 的值设为列表 (rose violet daisy buttercup),将光标放在下面表达式后面并输入 C-x C-e 求值即可。
(setq flowers '(rose violet daisy buttercup))
回显区会显示列表 (rose violet daisy buttercup),这是特殊形式 setq 的返回值。其副作用是将符号 flowers 绑定到该列表;也就是说,作为变量的 flowers 被赋予该列表作为值。(顺便一提,这个例子体现了:对 Lisp 解释器而言的副作用(赋值),往往是我们人类关心的主要效果。这是因为所有 Lisp 函数若无报错都必须返回值,而是否产生副作用则由设计决定。)
对 setq 表达式求值后,再对符号 flowers 求值,就会返回刚才设置的值。下面是该符号,将光标放在后面输入 C-x C-e:
flowers
对 flowers 求值后,回显区会显示列表 (rose violet daisy buttercup)。
顺便一提,如果对前面带引号的 'flowers 求值,回显区会直接显示符号本身 flowers。下面是带引号的符号,你可以试一下:
'flowers
此外,setq 还支持在单个表达式中为多个不同变量分别赋值,使用十分方便。
要使用 setq 将变量 carnivores 的值设为列表 '(lion tiger leopard),可使用下面的表达式:
(setq carnivores '(lion tiger leopard))
setq 也可同时为不同变量赋不同值。第一个参数绑定第二个参数的值,第三个参数绑定第四个参数的值,依此类推。例如,下面的表达式可将树木列表赋给符号 trees,将食草动物列表赋给符号 herbivores:
(setq trees '(pine fir oak maple)
herbivores '(gazelle antelope zebra))
(该表达式写在一行也可以,但可能超出页面宽度;格式化分行后更便于人类阅读。)
虽然我一直使用“赋值(assign)”这个说法,但也可以这样理解 setq 的工作方式:它让符号指向该列表。这种理解方式非常常见,后续章节中我们会遇到名称包含“指针(pointer)”的符号,其命名正是因为该符号绑定了一个值(通常是列表),或者说该符号被设置为指向这个列表。