2日目。
- 作者: Bruce A. Tate,まつもとゆきひろ,田和勝
- 出版社/メーカー: オーム社
- 発売日: 2011/07/23
- メディア: 単行本(ソフトカバー)
- 購入: 9人 クリック: 230回
- この商品を含むブログ (64件) を見る
ループ
while
第1引数の値が真のばあい、第2引数を評価します。式の値は第2引数の最後の値です(ここでは最後のi = i + 1
の結果の値)。
Io> i := 1 ==> 1 Io> while(i < 10, "hoge" println; i = i + 1) hoge hoge hoge hoge hoge hoge hoge hoge hoge ==> 10
第2引数が評価されなかったばあいの式の値はnil
です。
上のwhile
をそのままもう一度実行したばあい。
Io> while(i < 10, "hoge" println; i = i + 1) ==> nil
「引数」と書きましたが、実のところwhile
もObject
オブジェクトのメソッドとして実装されています。
上記ではオブジェクトの外でwhile
を使っていますが、そのばあいはマスター名前空間のオブジェクトであるLobby
にメッセージが送られます。
for
第1引数にカウンタ名、第2引数に初期値、第3引数に終了値を指定します。
第5引数がないばあい、第4引数を初期値から終了値のあいだまで評価します。
Io> for(i, 1, 9, i println) 1 2 3 4 5 6 7 8 9 ==> 9
第5引数があるばあい、第4引数は増分をあらわし、第5引数を評価します。
Io> for(i, 1, 9, 2, i println) 1 3 5 7 9 ==> 9
Ioでは余分な引数は無視されるようです。
次のように書くと第5引数は「i println; "hoge" println
」ですが、
Io> for(i, 1, 3, 2, i println; "hoge" println) 1 hoge 3 hoge ==> hoge
次のように書くと第5引数は「i println
」で、第6引数になる「"hoge" println
」は無視されます。
Io> for(i, 1, 3, 2, i println, "hoge" println) 1 3 ==> 3
コンマとセミコロンを間違えると予想外の結果を引き起こします。
==> hoge Io> for(i, 1, 3, i println; "hoge" println) 1 hoge 2 hoge 3 hoge ==> hoge
Io> for(i, 1, 3, i println, "hoge" println) 3 hoge ==> hoge
慣れないとちょっと怖い。
loop
ループにはもうひとつ、終了条件のないloop
があります。Ctrl+Cで強制終了してください。
Io> i := 1 ==> 1 Io> loop(i println; i = i + 1) 1 2 3 4 (以下略)
条件式
if
メソッドです。
第1引数が真ならば第2引数を評価し、偽ならば第3引数を評価します。
Io> a := 1 ==> 1 Io> b := 2 ==> 2 Io> if(a < b, "TRUE" println, "FALSE" println) TRUE ==> TRUE
式の値は最後に評価された値です。
面白いのは、if
メソッドを実行すると、まず第1引数が評価され、その結果によって第2引数か第3引数が評価されます。
C++やJavaでは、まず各々の引数が評価されて、そのあとに、それらの結果をもらってメソッドが実行されます。
Ioでは、引数はメソッドにそのままの状態で渡されて、引数をいつ評価するかはメソッドの中で決めることができます。いわゆる遅延評価というやつです。
上記の書き方の他に、C++やjavaのような書き方もできます。
Io> a := 1 ==> 1 Io> b := 2 ==> 2 Io> if(a < b) then("TRUE" println) else("FALSE" println) TRUE ==> nil
まずif
メソッドが実行され引数を評価し、その真偽を返します。上記のばあい真なのでtrue
を返します。
次にtrue
オブジェクトのthen
メソッドが実行されます。true
のthen
は引数を評価するので"TRUE" println
が評価され、文字列が表示されます。このときの戻り値はnil
です。
最後にnil
オブジェクトのelse
メソッドが実行されます。nil
のelse
は引数を評価せずnil
を返します。
真偽が逆になったばあい。
Io> a := 1 ==> 1 Io> b := 0 ==> 0 Io> if(a < b) then("TRUE" println) else("FALSE" println) FALSE ==> nil
まずif
メソッドが実行され引数を評価し、その真偽を返します。上記のばあい偽なのでfalse
を返します。
次にfalse
オブジェクトのthen
メソッドが実行されます。false
のthen
は引数を評価せずfalse
を返します。
最後にfalse
オブジェクトのelse
メソッドが実行されます。false
のelse
は引数を評価するので"FALSE" println
が評価され、文字列が表示されます。このときの戻り値はnil
です。
なので。
else
がないばあい、全体では真のばあいはnil
が、偽のばあいはfalse
が返ります。
Io> if(true) then("TRUE" println) TRUE ==> nil Io> if(false) then("TRUE" println) ==> false
ここまで読み解いてみると。「if
っていらなくね?」という疑問がわきますが。
そのとおりです。
Io> (a < b) then("TRUE" println) else("FALSE" println) TRUE ==> nil
もっとも。読み手を混乱させる効果ぐらいしがなさそうなのでやめておいたほうがよさそう。
その替わりに。Smalltalk風の書き方ができます。
Io> (a < b) ifTrue("TRUE" println) ifFalse("FALSE" println) TRUE ==> true Io> (a > b) ifTrue("TRUE" println) ifFalse("FALSE" println) FALSE ==> false
…繰返しと条件分岐の説明だけでこんなにかかるとは思わなんだ。
長くなったので。次回につづく。