progn 这个
通用特殊运算符预测用于评估零个或多个形式。返回最后一个表单的值。例如,在下文中, (打印“你好) 进行评估(和它的结果被忽略),然后 42 进行评价,并将其结果( 42 )被返回:
(progn
(print 'hello)
42)
;=> 42
如果预测中没有任何形式,则返回 nil :
(progn)
;=> NIL
除了对一系列形式进行分组之外,预测还具有如下重要特性:如果预测形式是顶级形式 ,则其中的所有形式都被处理为顶级形式。在编写扩展为多个表单的宏时,这可能很重要,这些表单应该全部作为顶级表单处理。
Progn 也很有价值,因为它返回最后一个表单的所有值。例如,
(progn
(print 'hello)
(values 1 2 3))
;;=> 1, 2, 3
相反,某些分组表达式仅返回结果生成表单的主要值。
隐含的进展
某些表单使用隐式进程来描述其行为。例如, when 和除非 宏( 如果形式基本上是单侧的)根据隐式预测描述它们的行为。这意味着形式就像
(when (foo-p foo)
form1
form2)
评估并且条件 (foo-p foo) 为真,然后将 form1 和 form2 分组,就好像它们包含在 progn 中一样。 when 宏的扩展基本上是:
(if (foo-p foo)
(progn
form1
form2)
nil)