次: , 前: Control Structures, 上: Control Structures


9.1 逐次実行

現れる順番にフォームを評価することは、 1つのフォームから別のフォームへ制御を移すもっとも一般的な方法です。 関数本体などのある種の文脈では、自動的にこのようになります。 それ以外では、これを行う制御構造の構文を使う必要があります。 prognがその制御構造で、Lispのもっとも単純な制御構造です。

スペシャルフォームprognはつぎのような形です。

     (progn a b c ...)

これは、フォーム、abc、…をこの順に評価します。 これらのフォームをprognフォームの本体と呼びます。 本体の最後のフォームの値が、progn全体の値になります。

初期のころのLispでは、prognは、 2つ以上のフォームを逐次実行しそれらの最後の値を使う唯一の方法でした。 しかし、プログラマは、(当時は)1つのフォームしか許されていない 関数の本体では、 prognを使う必要がしばしばあることに気づきました。 そのため、関数本体を『暗黙のprogn』にしたのです。 つまり、実際のprognの本体のように、 複数のフォームを許すようにしたのです。 多くの他の制御構造も、同様に、暗黙のprognです。 その結果、prognは、かつてほどは多用されません。 現在では、unwind-protectandorの内側や、 ifthen部分で必要とされるのがほとんどです。

— 特殊型: progn forms...

このスペシャルフォームは、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つの制御構造も同様にフォームを逐次評価しますが、 返す値が異なります。

— 特殊型: prog1 form1 forms...

このスペシャルフォームは、form1formsのフォームすべてを テキスト上の順に評価し、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)))
     
— 特殊型: prog2 form1 form2 forms...

このスペシャルフォームは、form1form2formsの フォームすべてをテキスト上の順に評価し、form2の結果を返す。

          (prog2 (print "The first form")
                 (print "The second form")
                 (print "The third form"))
               -| "The first form"
               -| "The second form"
               -| "The third form"
          => "The second form"