一、区块
有3个构造区块的基本操作符:progn , block 以及 tagbody 。
1、在progn 主体中的表达式会依序求值,并返回最后一个表达式的值。
2、一个 block像是带有名字及紧急出口的progn。第一个参数应为符号。这变成了区块的名字。在主体中的任何地方,你可以停止求值,并透过使用return-from指定区块的名字,来立即返回一个数值:
CL-USER> (block head
(format t "Here we go.")
(return-from head 'idea)
(format t "We'll never see this."))
Here we go.
IDEA
也有一个return 宏,它把传入的参数当做封闭区块nil的返回值:
CL-USER> (block nil
(return 27))
27
一个let* 功能上等同于一系列嵌套的let 。
CL-USER> (let* ((x 1)
(y (+ x 1)))
(+ x y))
3
destructuring-bind 宏是通用化的let 。与其接收单一变量,它接受一个模式(pattern) 一个或多个变量所形成的树,并将它们与某个实际的数所对应的部分做绑定。
二、多值
在Common Lisp中,一个表达式可以返回零个或多个数值。values 函数返回多个数值。它一个不少地返回你作为数值所传入的参数:
CL-USER> (values 'a nil (+ 2 4))
A
NIL
6
要接收多个数值,我们使用 multiple-value-bind:
CL-USER> (multiple-value-bind (x y z) (values 1 2 3)
(list x y z))
(1 2 3)
可以由multiple-value-call 将多值作为参数传递到第二个函数:
CL-USER> (multiple-value-call #' + (values 1 2 3))
6