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{
  // 開けなかった
}