[ Eiffel Liberty | GUERL | sOOap ]
by
Alan A. Snyder
and
Brian N. Vetter
4 - 制御フローの構成要素群 - 条件分岐、反復、そして多岐分岐 4.1 繰り返し 4.2 条件分岐のための構成要素群 4.3 多岐分岐
話を単純にするために、Eiffel には、反復に関する構成要素が一つだけがあり、それは繰り返しの構成要素である、とします。もしかしたならば、たった一つの繰り返しの構成要素で「出発」することが可能であるかを、尋ねるかもしれません。それは、結局は、従来の言語でよく私たちに提供される FOR、WHILE、そして REPEAT のすべての繰り返しです。Eiffel の繰り返しのための構成要素は、上記の繰り返しのそれぞれと同じ流儀で振る舞う繰り返しを構成できるほど十分に総称的です。たった一つの繰り返しの構成要素しかないことの利点は、一度だけ、つまりその一つだけを学習する、ということです。プログラマに、繰り返しの性格を危険に変更すること許す変種はありません。このことは、上記の繰り返しのそれぞれの恩恵のすべてを与える構成要素を学習するための単純さと容易さを促進します。繰り返しの単純な例は、次のようです。
from --初期化 until done -- BOOLEAN 条件 loop -- 実行文 endfrom 句は、必須であり、初期化のための文を指定します。この例では、実行される初期化は何一つありません。
二番目に必須な句は、until です。これは、その式が True へ評価されたときに、繰り返しを停止させます。二つ以上の式を供給することもでき、この場合には、それぞれの式をセミコロン ";" で分離します。
loop...end は、反復すべき繰り返しの本体です。反復の最中に実行すべきすべての動作は、ここに置きます。
Eiffel の繰り返しの構成要素を使用する FOR、WHILE、そして REPEAT の繰り返しの振る舞いを、どのように模倣するかを説明するのに最も適したものであったでしょう。まず、私たちは、反復の回数が固定で事前に決定されているという特徴を持つ、FOR ループから始めることにします。私たちは、次のように、for ループのように動作する繰り返しを構成できます。
from i := 1 until i = 10 loop io.put_int (i); io.new_line; i := i + 1; end私たちが FOR ループを模倣するのに達成する方法は、自動的増分の効果が構成されるように、カウンタ変数を自分で増加させることによります。繰り返しの構成要素の一貫性と一般性を保護しながら、この独自の増分の文を含めることは、たいした労力ではありません。
WHILE ループをプログラムするためには、次のようにします。
from node := first; until node = Void; loop io.put_string (node.text); node := node.next; end;このループは、node(ノード)が Void ではない間(WHILE)ループ本体を実行せよ、と言うのと類似しています。伝統的な WHILE ループの効果 -- 初期のループの実行とループ本体のすべての後続の反復との前に、ループの打ち切りを検査すること -- は、実現されています。
私たちは、REPEAT ループを望むときに、同じような動作を実行できます。わずかな違いがあります。けれども、そして、つまり、私たちは、実際にこのループが少なくとも一回は実行することを保証するために、until 句が最初の反復に関して False へ評価されることを保証しなければならない、ということです。私たちは、次のように、これを達成できます。
from done := False until done and pages = 10; loop done := True; printer.output_next; pages := pages + 1; enddone 式(BOOLEAN 変数)は、最初に False へ評価するから、until 句は、最初に False へ評価されることになり、このため、ループ本体の少なくとも一回の実行を保証します。
他の水準の言語のように、Eiffel は、if...elseif...end という構成要素を持っています。それは完全に、(もし直近の end を持たなければならないなら、それぞれ)括弧で括られます。この例は、次のようです。
... if x > 10 then ... 文 ... elseif x > 5 then ... elsif 文 ... elseif x > 0 then ... もう一つの elsif 文 ... else ... else 文 ... endもしこの文がかなり平凡であるならば、これ(そして、他の大部分)の機能性によって、他に言及すべきことは、これ以上必要ないでしょう。
拡張的な if...elseif 文をコーディングする代わりに、Eiffel は、多岐分岐の構成要素である inspect..when をサポートしています。この構成要素は、大部分の他の言語の CASE あるいは SWITCH 文を模倣します。その有用さは、上で言及した伝統的な構成要素の有用さと肩を並べうるものです。
inspect input_character; when 'y' then ... 文 when 'n' then ... 文 else ... もし input_character が一致するものが見つからなかったら endここで、input_character の値に依存した、ふさわしい文が実行されます。この場合に、もし input_character が 'y' でも 'n' でもないならば、else 句の文が実行されます。
次の例は、多岐分岐の命令が、列挙された変数の値に基づくかもしれない CASE 文を模倣するために、唯一<unique>な属性とどのように結合するかを示しています。
... State : INTEGER; State_1, State_2, State_3 : INTEGER is unique; ... inspect State when State_1 then some_action; when State_2 then some_other_action when State_3 then another_action; else no_action; end;この例は、state(状態)を分析し、その値に依存してふさわしい動作を取ります。もし state が何らかの他の値であるならば、else 句が実行されます。もう一度、inspect という構成要素の効果は、ありふれており、これ以上議論しないことにします。
[ 目次 ] [ イントロ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Copyright ] [ html (full) | ps | pdf ]
[ Eiffel Liberty | GUERL | sOOap ]