まだ組み込んでないけど、とりあえずドキュメント見つつざっと触ってみた時にとっていたメモ。(いつもの事ですが)自分で読み返す用のメモであって、入門とか紹介とかではない。
callee が今実行している関数
r: fun(x) { if (x > 0) { return callee(x-1) * x; } return 1; } r(5).p;
文字列
文字列は変更不能オブジェクトです。
そのため a ~= b; という連結代入演算子は、 a = a ~ b; と同じ意味となります。
こういうことですね。
a: "Hello"; b: a; a ~= " World"; a.p; //=>Hello World b.p; //=>Hello
%f でフォーマット文字列
(%f"%s -> %d")("hoge", 100).p; //=> hoge -> 100
可変引数カッコイイ!
hoge: fun(...) { ...[0].p; ... { it.p; } } hoge(12,34,56,78);
fun と method の違い
method だと this の扱いが JavaScript っぽくなる。サンプルは書くのがめんどくさいので略。
意味はわかったけど、使い分ける場面がどんな時なのかが思いつかない‥‥。特に気にしないで、クラス内だけ method になってると思っておこう。
getter/setter
値の設定は obj.foo = 100; と書きます。これは obj.set_foo(100) のシンタックスシュガーです。
インスタンス変数定義文で、可触性の修飾子をつけると、コンパイラがhogeメソッドと、set_hogeメソッドを、その可触性で定義します。
getterとsetterで可触性を変えたい場合、メソッドを自分で定義してください。
どうせなら、getterとsetterの可触性が別の場合の糖衣構文があると嬉しい気がする。Object-C 2.0 みたいな。
多重継承あり
キーワード引数
fun foo(a, b, c:null, d:null, e:null) { a.p; b.p; c.p; d.p; e.p; } foo(1,2,c:3,e:4,c:5);//=>1 //=>2 //=>3 //=><null> //=>4 foo(1,2,3,e:4,c:5); //=>1 //=>2 //=>3 //=><null> //=>4
デフォルト引数を指定したものがキーワード引数として指定可能になるっぽい。引数指定が重複したときは最初に指定したもの優先でいいのかな?
セカンダリキー
なじみが無いんだけど、どういう場面で使うものなんだ? こうとか?
class Bar { hoge#Int(i) (%f"Int %d")(i).p; hoge#String(s) (%f"String %s")(s).p; } x: Bar(); v: "Hello"; x.hoge#(v.class)(v); //=> String Hello v = 100; x.hoge#(v.class)(v); //=> Int 100
範囲演算子、かっこいい。
a .. b // 範囲[expr, expr] a ..< b // 範囲[expr, expr) a <.. b // 範囲(expr, expr] a <..< b // 範囲(expr, expr)
優先順位のコンパイルエラーがかっこよすぎるwww
Xtalは優先順位と空白がマッチしていない場合、コンパイルエラーとします。
10 + 5*6 // ok 10+5*6 // ok 10+5 * 6 // error +より*の方が優先順位が高いのに、見た目はそうなっていない。
ループ文の nobreak と else 便利。first_step は‥‥
first_step より Squirrel みたいにループカウンタ持っててくれてた方が便利だよなー。