好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

Xtal を触ってみたメモ

まだ組み込んでないけど、とりあえずドキュメント見つつざっと触ってみた時にとっていたメモ。(いつもの事ですが)自分で読み返す用のメモであって、入門とか紹介とかではない。

日本語

文字コードの設定が正しく行われているならば、日本語の識別子も使うことが出来ます。

機会があったら活かして見よう。

予約語

  • debug
  • default

は油断してると使ってしまいそう

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 みたいにループカウンタ持っててくれてた方が便利だよなー。

0 は真

特にドキュメントに書いてない(?)けど Ruby のように 0 は 真になるようだ。

これ、組み込み言語としては斬新な仕様だよなぁ。たしかに、C の関数の戻り値は NO_ERROR が 0 でマイナス値がエラーコードに使われてたりするのも多いことを考えると理にかなっているような気もする。Xtal から C++ に組みなおすときに、うっかりミスをやりやすいような気もする。

組み込むときに意識してみる。