2006-01-01から1年間の記事一覧

ArrayとIterator

配列の要素巡回には次のような方法があります。 普通にfor文で for(i : 0; i

warning C4355

struct Foo{ void* p; Foo():p(this){} }; ---- warning C4355: 'this' : ベース メンバ初期化リストで使用されました。VCではこのような警告を出してくれます。しかし、どうしても初期化リストでthisポインタを使用したいときがあります。最初は #pragma wa…

Xtalのループ文

Xtalはループ文にラベルをつけることができます。 outer : while(true){ while(true){ break outer; // 外側のループから脱出する } }Iteratorの繰り返しでもラベルによる脱出が可能です outer : 50.times{ while(true){ break outer; // 外側のループから脱…

今日の修正

この修正は0.9.2.2に入ります。0.9.2.2は近いうちに出します。 ブロックパラメータを省略可能に。省略した場合itというローカル変数が定義される。つまり次の二つは同じ意味 [0, 2, 5, 6]{ |v| println(v); } [0, 2, 5, 6]{ println(it); } for文やIterator…

0.9.2.1 ダウンロード

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

STLとAllocator

XtalはSTLのコンテナを使う場合に独自のカスタムアロケータを渡してメモリ確保をコントロールしているのですが、あるSTLのmapの実装で、allocate関数で渡されたnの値と、deallocate関数で渡されたnの値が異なることがあり困っています。独自のメモリプールが…

連結演算子 ~

Dに倣って連結演算子 ~ を導入することにしました。 str : "abc" ~ "efg"; ary : [0, 2] ~ [4];なんか微妙に違和感。

文字列の連結

Java Puzzlersのパズル30では、言語設計者は文字列連結演算子に + を用いるべきではなかった、とのアドバイスがあります。 現在Xtalは文字列連結に + を使用します。D言語を参考に ~ を連結演算子として導入することも考えたのですが、C++でそんな2項演算子…

java puzzlers

http://www.amazon.co.jp/exec/obidos/ASIN/4894716895 本来、JAVAはシンプルで理解しやすい言語として設計されたにも関わらず、この本で上げられているような落とし穴がないわけではない。本来のコンセプトにそぐわない、どうして、そのような状況になって…

0.9.2.0の変更内容

moduleの仕様削除 classの継承の書式を変更 Python風に Foo : class(SubClass){} と書く Iteratorのブロックパラメータの仕様変更 シリアライズ機能追加 バイトコードの保存も

ダウンロード

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

intern

RubyではStringとSymbolが分かれていますが、Xtalでは分かれていません。 当初は分かれていたのですが、そもそもStringは変更不能オブジェクトなので分ける必要性は無いと気付いたためです。Xtalは基本的にソースコード上に書かれた文字列リテラルは全てinte…

文字列の文字コード

これはどうすべきなのでしょうか。 今はソースの文字を何の変換もせずにそのまま保持しています。UCS2で保持するのが今の主流のようですが、気が乗りません。 理由は次の通りです。 コンソールではUCS2を表示できない環境がある。 文字列を保存するとき、読…

コンパイル済みバイトコードの拡張子はどうしよう?

.xtalc .crystal .ctal .xc .xlc

バイトコードの保存

手元のソースでは、以前出来なかったコンパイル済みバイトコードのファイル保存が可能になりました。また、基本型(Null, Int, Float, String, Array, Map)のシリアライズにも対応しました。 これはゲームに使うなら必須な機能ですよね。 Xtalはバイトオーダ…

::

'::' を '.' にする実装が終わりました。 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オブジェクトがアロケートされているからです。 ゲームでは浮動小数…