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) 为真,然后将 form1form2 分组,就好像它们包含在 progn 中一样when 宏的扩展基本上是:

(if (foo-p foo)
  (progn
    form1
    form2)
  nil)