|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]);