else nobreak
Xtalはループ文にelseをつけることが出来ます。このelseは、Pythonのループ文に付けられるelseと意味が異なります。
Pythonのelse節は、ループ継続条件文がfalseになったときに、つまりループ本文中にbreak等でループを脱出しなかった場合に実行されます。
Xtalでは、それはnobreak節が相当します。Xtalのelse節は一度もループ本文が実行されなかったときに実行されます。
10.times{ it.p; } nobreak{ // break等で脱出してないので実行される } 10.times{ it.p; } else{ // break等で脱出していないが // ループ本文を一度以上通っているので実行されない } 0.times{ } else{ // 一回もループ本文を通らないので実行される } 0.times{ } nobreak{ // 一回もループ本文が実行されないので // 当然break等で脱出してないので実行される }
nobreak節とelse節を同時につけることはできず、どちらかだけです。
何故Pythonと違う仕様となっているのでしょうか?これは、次のようなケースに対処するためです。
ファイルをブロックの間だけ開く機構を定義するとします。
FileOpen: class{ @file_name; initialize: method(file_name){ @file_name = file_name; } iter_first: method(){ // ファイルを開く処理 if(bad_file){ // 開けなかった return null; // 一度も繰り返さない } return this, fd; } iter_next: method(){ // ファイルを閉じる return null; // 繰り返しを止める } iter_break: method(){ // ファイルを閉じる } }
こう定義すれば、次のように使えます。
FileOpen("test.txt"){ |f| // ファイルが開けた // ファイルを操作 } else{ // 開けなかった }
もしelseがPythonと同じ意味の場合、次のように書かなければいけません。
FileOpen("test.txt"){ |f| // ファイルが開けた // ファイルを操作 break; // breakを書かないとelse節を通ってしまう! } else{ // 開けなかった }