正規表現

Xtal正規表現を持つ予定はありません。
正規表現の代わりに PEGのパーサ生成器 を組み込みで持つ予定でいます。

WikipediaのPEGの説明ページ
http://ja.wikipedia.org/wiki/%E8%A7%A3%E6%9E%90%E8%A1%A8%E7%8F%BE%E6%96%87%E6%B3%95
>利点
> PEG は正規表現より強力であり、よい代替手法となる。例えば、正規表現再帰的ではないため本質的に括弧の対応付けができないが、PEG では可能である。


↓こんな感じになる予定です。

// 整数のカンマ区切りパーサの定義
parsr: integer >> *(-"," >> integer);

// 結果格納オブジェクト
ret: [];

// パース開始
// stdinには 5,100,6,7 と入力されるとする
if(parser.parse(stdin, ret)){
   // パース成功

   ret.p; //=> [5,100,6,7]

}else{
   // パース失敗
}

|a, b| expr;

Xtalは、fun(a, b) expr; で関数式を記述できますが、|a, b| expr;という書式でも関数を作ることが出来ます。

0.9.7.0より前では、fun(a, b) expr; と |a, b| expr; に違いは無かったのですが、0.9.7.0からは|a, b| expr; の挙動を変更しました。

a, b expr; で関数を生成した場合、「引数は多重代入と同じルールで渡される」という仕様になりました。
add: |a, b| a+b;
add([5, 10]).p; //=> 15
// 配列を渡すと展開されて代入される

make_array: |a| a;
make_array(7, 8, 9, 7).p; //=> [7,8,9,7]
// 多すぎる引数を渡すと、配列にまとめられて代入される

これにより、次のような記述が出来るようになります。

array.each.with_index.with_index.map(|index1, index2, value| index + index2 + value);

これまでの仕様では、mapで渡した関数に渡される引数は([index1, [index2, value ] ]); であるため、上のように書けず、次のようにしなければなりませんでした。

array.each.with_index.with_index.map(|v| v[0] + v[1][0] + v[1][1]);