Next: , Up: Control Structures   [Contents][Index]


10.1 Sequencing

フォームが出現する順番に評価するのは、あるフォームから別のフォームに制御を渡す、もっとも一般的な制御です。関数のbodyのような、あるコンテキストにおいては、自動的にこれが行なわれます。他の場所では、これを行なうために制御構造を使用しなければなりません。Lispで一単純な制御構造は、prognです。

スペシャルフォームprognは、以下のようなものです:

(progn a b c …)

これは、順番にabc、...を実行するよう指定します。これらはprognフォームのbodyと呼ばれます。body内の最後のフォームの値が、progn全体の値になります。(progn)nilをreturnします。

初期のLispでは、prognは、連続で複数のフォームを実行して最後のフォームの値を使用する、唯一の方法でした。しかしプログラマーは、関数のbodyの、(その時点では)1つのフォームだけが許される場所で、prognを使用する必要が多いことに気づきました。そのため、関数のbodyを“暗黙のprogn”にして、prognのbodyのように複数のフォームを記述出きるようにしました。他の多くの制御構造も、同様に暗黙のprognを含みます。結果として、昔ほどprognは多用されなくなりました。現在では、prognが必要になるのは、unwind-protectandorifthenパートの中がほとんどです。

Special Form: progn forms…

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

(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つの構成は、一連のフォームを同様に評価しますが、異なる値をreturnします:

Special Form: prog1 form1 forms…

このスペシャルフォームは、form1formsのすべてをテキスト順に評価して、form1の結果をreturnします。

(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"

以下の例は、変数xのリストから1番目の要素を削除して、削除した1番目の要素の値をreturnします:

(prog1 (car x) (setq x (cdr x)))
Special Form: prog2 form1 form2 forms…

このスペシャルフォームは、form1form2、その後のformsのすべてをテキスト順で評価して、form2の結果をreturnします。

(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"