Next: Conditionals, Up: Control Structures [Contents][Index]
フォームを出現順に評価するのは、あるフォームから別のフォームに制御を渡すもっとも一般的な制御です。関数のbodyのようなコンテキストにおいては自動的にこれが行なわれます。他の場所ではこれを行なうために制御構造を使用しなければなりません。Lispで一単純な制御構造はprogn
です。
スペシャルフォームprogn
は以下のようなものです:
(progn a b c …)
これは順番にa、b、c、...を実行するよう指定します。これらはprogn
フォームのbodyと呼ばれます。body内の最後のフォームの値がprogn
全体の値になります。(progn)
はnil
をリターンします。
初期のLispでは、progn
は、連続で複数のフォームを実行して最後のフォームの値を使用する、唯一の方法でした。しかしプログラマーは、関数のbodyの、(その時点では)1つのフォームだけが許される場所で、progn
を使用する必要が多いことに気づきました。そのため、関数のbodyを“暗黙のprogn
”にして、progn
のbodyのように複数のフォームを記述出きるようにしました。他の多くの制御構造も、同様に暗黙の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"
以下の例は変数x
のリストから1番目の要素を削除して、削除した1番目の要素の値をリターンする:
(prog1 (car x) (setq x (cdr x)))
このスペシャルフォームはform1、form2、その後のformsのすべてをテキスト順で評価して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"