次: Conditionals, 前: Control Structures, 上: Control Structures
現れる順番にフォームを評価することは、
1つのフォームから別のフォームへ制御を移すもっとも一般的な方法です。
関数本体などのある種の文脈では、自動的にこのようになります。
それ以外では、これを行う制御構造の構文を使う必要があります。
progn
がその制御構造で、Lispのもっとも単純な制御構造です。
スペシャルフォームprogn
はつぎのような形です。
(progn a b c ...)
これは、フォーム、a、b、c、…をこの順に評価します。
これらのフォームをprogn
フォームの本体と呼びます。
本体の最後のフォームの値が、progn
全体の値になります。
初期のころのLispでは、progn
は、
2つ以上のフォームを逐次実行しそれらの最後の値を使う唯一の方法でした。
しかし、プログラマは、(当時は)1つのフォームしか許されていない
関数の本体では、
progn
を使う必要がしばしばあることに気づきました。
そのため、関数本体を『暗黙のprogn
』にしたのです。
つまり、実際のprogn
の本体のように、
複数のフォームを許すようにしたのです。
多くの他の制御構造も、同様に、暗黙のprogn
です。
その結果、progn
は、かつてほどは多用されません。
現在では、unwind-protect
、and
、or
の内側や、
if
のthen部分で必要とされるのがほとんどです。
このスペシャルフォームは、formsのフォームすべてを テキスト上の順に評価し、最後のフォームの結果を返す。
(progn (print "The first form") (print "The second form") (print "The third form")) -| "The first form" -| "The second form" -| "The third form" => "The third form"
他の2つの制御構造も同様にフォームを逐次評価しますが、 返す値が異なります。
このスペシャルフォームは、form1、formsのフォームすべてを テキスト上の順に評価し、form1の結果を返す。
(prog1 (print "The first form") (print "The second form") (print "The third form")) -| "The first form" -| "The second form" -| "The third form" => "The first form"変数のリストから先頭要素を取り除き、取り除いた要素を返すにはつぎのように書く。
(prog1 (car x) (setq x (cdr x)))