Prog1 和 Prog2

通常,评估多个表达式并从第一个或第二个表单而不是最后一个表单返回结果会很有帮助。这很容易使用 let 来实现,例如:

(let ((form1-result form1))
  form2
  form3
  ;; ...
  form-n-1
  form-n
  form1-result)

因为这种形式在某些应用程序中很常见,所以 Common Lisp 包含 prog1prog2 ,它们类似于 progn ,但分别返回第一和第二种形式的结果。例如:

(prog1
  42
  (print 'hello)
  (print 'goodbye))
;; => 42
(prog2
  (print 'hello)
  42
  (print 'goodbye))
;; => 42

然而, prog1 / prog2progn 之间的一个重要区别是, progn 返回最后一个形式的所有值,而 prog1prog2 仅返回第一个和第二个形式的主值。例如:

(progn
  (print 'hello)
  (values 1 2 3))
;;=> 1, 2, 3

(prog1
  (values 1 2 3)
  (print 'hello))
;;=> 1              ; not 1, 2, 3

对于使用 prog1 样式评估的多个值,请使用 multiple-value-prog1 。没有类似的 multiple-value-prog2 ,但是如果你需要它并不难实现。