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 ,但是如果你需要它並不難實現。