2006-10-01から1ヶ月間の記事一覧

::

'::' を '.' にする実装が終わりました。 obj.fooはobjがクラスでfooがメソッドなら、メソッド呼び出しという意味でなくメソッドオブジェクトfooを返すようになりました。この結果、 obj : Int; // 変数objにIntクラスを入れる println(obj.to_s); はクラス…

言語仕様変更

今週はC++のリファレンス強化週間の予定でした。ところがつい前から気になっていた言語仕様を煮詰める方に一所懸命になってしまいました。 開発が進めば仕様変更はなるべく止めなければなりませんし、変えるなら今のうちだと。現在の仕様で特に二つ気になっ…

duplo

以前id:togeさんのところで見た、duploという、コピペされた重複行を調べるアプリでXtalのソースを検査しました。http://sourceforge.net/projects/duplo Configuration: Number of files: 52 Minimal block size: 4 Minimal characters in line: 3 Ignore p…

0.9.1.1公開

Xtal version 0.9.1.1 Xforマクロがバグっていたのを修正 今週はC++のサンプル、リファレンス強化週間にすることにします。

型情報を値に埋め込む実装を追加

以前のエントリで言っていた型情報を値に埋め込む件を試してみました。 次のようなイメージの実装になっています。 enum Type{ TYPE_NULL = 0, TYPE_BASE = 1, TYPE_INT = 2, TYPE_FLOAT = 3, TYPE_MASK = (1<<1) | (1<<0), TYPE_SHIFT = 2 }; class Value{ …

global変数は無い

Xtalにはglobal変数というモノは存在しません。 あるファイルで定義した変数は、他のファイルにまったく影響しません。ただし、global変数のような動作をするモノをこしらえることはできます。一例を示します。 // global.xtal // 連想配列をexportする。 ex…

toplevelモジュール

コンパイル単位でのトップレベルの変数を保持するモジュールオブジェクトです。 静的に発見できない変数参照は、toplevelモジュールから検索されます。 println(foo); // toplevel::foo と同じ意味 そのため、toplevelにincludeすれば、暗黙的な変数参照の対…

libオブジェクト

他のファイルに書かれたライブラリを読み込みたい。 (Cでいうinlcude、Rubyでいうrequire、Pythonでいうimportがしたい)そんな時には libオブジェクト を使います。libオブジェクトは特殊なオブジェクトで、lib::foo とアクセスした場合、foo.xtalを読み、そ…

0.9.1公開

バージョンが上がりました。修正内容 libオブジェクト周辺のバグを修正 moduleに追加定義したメンバが正しく検索されないことがあるバグを修正 値に型情報が埋め込まれたバージョンのUncountedAnyを用意 Xtal version 0.9.1 VC7とgcc version 3.4.4 (cygming…

拡張BNFで表したXtalの文法

yacc等のツールを使用していないため、BNFは頭の中にしか書かれていなかったのですが、この度書き出してみました。 これは正確なものではなく、あくまで大体こんな感じ、という位のモノです。 抜けもあるかもしれません。 binint ::= '0' 'b' [01_]+ hexint …

ローカル変数参照ルール

上に関連した話です。ローカル変数参照の解決は、次のルールによって決定されます。 外側のスコープに向かって、一番近い同名の変数を静的に探す。 静的に見つからない場合、toplevelオブジェクトのメンバから動的に検索される。 toplevelに無い場合、例外が…

何故Xtalは変数定義構文を持つ?

Xtalでは 変数名 : 初期値;という書式で変数の定義が出来ます。スクリプト言語と呼ばれるモノの多くは、この明示的な変数の宣言の構文を持たず、最初の代入式がそれを兼ねるものが多い中、何故こういう方式を採用したのか、を説明します。Xtalは {} が変数の…

演算子と優先順位

今日はちょっとだけ目新しい機能の紹介をします。 Xtalはちゃんと演算子に優先順位がついています。例えば+と*は、*の方が優先順位が高いため 10 + 5 * 3は、5*3が先に計算されて、10+15が計算されます。良くあるほかの言語のように、括弧を使えば、+を先に…

バグ発見

0.9.0は盛大にメモリリークするバグ、循環参照のオブジェクトの解放時に落ちることがあるバグがありました。

浮動小数点数

Xtalは浮動小数点数の演算速度が、整数と変わらない実装になっています。Rubyでは整数に比べ、浮動小数点数の演算が遥かに遅くなっています。浮動小数点数は整数と違い、演算する度にFloatオブジェクトがアロケートされているからです。 ゲームでは浮動小数…

名前の由来

Xtalというもともとの単語自体は、Crystalの略語です。なぜ言語の名前にしたのかは、次のどれか、もしくは全てです。 eXtensible Agile Languageの略 Rubyと同じように宝石の名前にしたかった アジャイル言語として産まれたから(アジャイルといえばクリスタ…

ダウンロード

Xtal version 0.9.0 VC7とgcc version 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)でコンパイル、用意した全てのテストコードがパスするのを確認。言語仕様 クラス、モジュール、組み込み関数 C++に組み込む まだ安定性、ドキュメントが欠けていて…

Xtal version 0.9.0

以前よりそこそこ体裁を整えました。10/18 追記 メモリリークと循環参照を持つオブジェクトの解放時に落ちるバグを修正しました。

デフォルト引数、キーワード引数

Xtalはデフォルト引数、キーワード引数をサポートします。例: foo : fun(a:10, b:20){ println(a + b); } foo(); // 30 foo(50); // 70 foo(b:80); // 90 foo(b:1, a:2); // 3

once

onceとは、一度しか式を評価しないという意味の単項演算子です。2度目以降は、最初に評価された式の値を返しつづけます。 次のようなことが可能になります。 foo : fun(val){ ary : once []; ary.push_back(val); println(ary); } foo(5); // [5] foo(10); …

Class class

Xtalでは全てのオブジェクトがクラスに属すので、当然クラスもClassクラスというものに属しています。同様にモジュールもModuleクラスに属しています。そして、ClassクラスはModuleクラスを継承しています。つまり、ほぼRubyと同じモデルになっているわけで…

is, !is

Xtalでは、全てがオブジェクトで、全てが何かのクラスに属しています。あるオブジェクトがあるクラスのインスタンスかを調べるには、is演算子 を使います。 整数リテラルはIntクラスに属しているので、次の例は "true"と表示されます。 if(100 is Int){ prin…

callee

Xtalはcalleeキーワードで、現在実行中の関数を取得出来ます。そのため callee() と書くと再帰呼び出しとなります。これは無名関数で再帰を可能にするために導入されました。例: foo : fun(f){ println(f(10)); } foo(fun(i){ if(i==0) return 1; return cal…

null, nop

Xtalには、Rubyのnilとほぼ同等なnullオブジェクトが存在します。 nullはnullが持っていないメソッド等を呼び出すと、例外が発生します。そして、nullのような、しかしちょっと毛色の違う nop というオブジェクトが存在します。 nopはnopが持っていないメソ…

多値

関数は2個以上の値を返すことが出来ます。 多重変数定義か多重変数代入で複数の値を受け取ることが出来ます。 左辺の方が多い場合、足りないところはnullが代入されます。 右辺の方が多い場合、余った値は切り捨てられます。 foo : fun(){ return 5, 8; } ba…

バグの修正とテストスクリプトを黙々と書いてます。

セレクターネームスペース削除

この日は、セレクターネームスペース周りについて考えてました。 最終的な結論として、セレクターネームスペースは、Xtalの仕様から削除されることになりました。 実装してみたものの、言語仕様やC++のインターフェイスが複雑になり、実行速度が落ちる割に、…

例外

この日はすごいバグってた例外周りを修正しました。 バージョン0.9で反映されます。Xtalの例外はJavaScriptとほぼ同じような仕様となってます。例: test.xtal ファイルに記述して実行するとする foo : fun(){ // 例外の送出 throw Exception("Error!"); } tr…

ガーベジコレクション

最近の言語、特にスクリプト言語において、ガーベジコレクションを採用しないのはありえません。 当然Xtalもガーベジコレクションを持っています。Xtalは紆余曲折の結果、一番原始的なgcのアルゴリズム、参照カウントgcを採用することにしました。途中までは…

バイトコード採用

Xtalは独自のバイトコードを独自の仮想マシンが解釈して駆動します。XtalのバイトコードはJavaのバイトコードの仕様を参考にして作られました。 当初はバイト単位ではなく、マシンが一番早く計算できるword単位にしていました。何故変えたかというと、ある日…