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

GC

Xtalは参照カウンタとマークアンドスイープGCの併用となっており、GCを実行しなければメモリ使用量が閾値を超えない限りは、オブジェクトは一切回収されません。 そのため、毎ループxtal::gc関数を呼び出すことをお勧めします。gc関数はほとんど実行時間がか…

メモリ

Xtalはゲーム用途に使われることを想定しています。 ゲーム開発者の方々が気にすることの一つに「メモリはどこから確保されるのか」というのがあると思います。 昨今はメモリが増えたといっても、やはり断片化等で足りなくなる状況はありますので、気にする…

もしかして機能はじめました

LL魂のイベントで、Rubyにもしかして機能が追加された、というジョークを聞いて以来、そのうち実装してみたいなーと考えていました。array.langwerth と length と書くつもりが手が滑ってlangwerthと書いてしまった場合、次のように表示されるようになりまし…

あと

DOFI-BLOGでFLASHゲーム公開しました。ネコとイルカががんばるゲーム「Cat on a Dolphin」時間がありましたらプレイしてみてください。 そうそう。一作前からAS3で作ってます。AS3はAS2より1〜10倍速くなるということでそうしたのですが、本当に速くなったの…

PEG

師走ってる間に、世間ではPEG意見交換会というようなことが開かれたんですね。行って見たかったかも。XtalのPEGは、正規表現の代替として使えるようにするため、PEGを正規表現に近づけて行ったのですが*1、正規表現をPEGに近づけた方がいろいろとよいと思っ…

[内部実装について] C++の例外をoffにしても大丈夫なように

これまでも一応C++の例外をoffに出来ていたのですが、とても制限が多いものでした。 例えば、protectedの関数を外部から呼んだ場合やC++の関数に渡すべきオブジェクトの型を間違えていた場合、復活できずにexit(1)で強制終了させていました。 それの制限をな…

関数式の違い

関数は fun(arg) expr という形式と、|arg| expr という形式で作ることが出来ます。 これらは記法の違い以外に、動作の違いもあります。 arg expr で作った関数は、呼び出しの際、多重代入と同じルールで引数が渡されます。 foo: fun{ return 1, 2, 3; } boo…

多値 再考

これまで、Xtalにおいて多値と配列は同じものである、と定義して、配列と多値が区別できない仕様にしていたのですが、ちょっと実装が難しい事例があったので、この仕様を見直すことにしました。 新しい仕様は次の通りです。 配列か多値かを区別できるように…

擬似if文の罠

この擬似if文は一つ罠があります。 この擬似if文の内部でbreakやcontinueを呼び出すと、ブロック文はあくまでループ文の一種なので、その擬似if文に対してbreakしたりcontinueしてしまうことになってしまうのです。 break、continueする際は、なるべくラベル…

ユーザー定義のif文

Xtalはブロックを使うことで、if文とほとんど同じ機能を書くことが出来ます。 If: class{ _cond; initialize: method(cond){ _cond = cond; } block_first: method{ return _cond ? this : null; } block_next: method{ return null; } } If(n < 20){ "true"…

export文廃止

svn上のソースではかなり前からなくなっているのですが、exportは廃止して、これからは代わりにreturn文を使うようにすることにしました。 トップレベル(関数の中じゃないところ)からreturnすると、その結果を返せます。 // Animal.xtal Animal: class{ } re…

可触性について

以前可触性はC++と同じ、ということを書きましたが、そう実装できていなかったし、Xtalの仕様的にC++と同じにするのは無理でした。なので、若干意味を変えます。 publicメンバはアクセス制限なし。 privateメンバは、レキシカルスコープで見える場所からしか…

format

XtalでC言語のsprintfのような文字列の組み立てがしたい場合、フォーマット文字列生成式を使います。フォーマット文字列は、%f"書式指定文字列"で生成します。 fmt: %f" %s = %d "; fmt2: %f! %d %d !; // %fの後は任意の記号が使える。 (や[を使った場合、)…

配列化演算子、連想配列化演算子

PseudoArrayをなくしたので、mapメソッドなどは依然としてイテレータを返す仕様に戻りました。イテレータを配列化する機会が多くなるということになります。 多く使う割りに、 .to_a は少々打ちづらい気がします。そこで配列化演算子を導入することにしまし…

PseudoArrayを削除した

まつもとさんにも言及されたPseudoArray *1なのですが、悩んだ結果、なかったことにすることにしました。 止めた理由は次の通りです。 ary: "a".."z".each.with_index; ary.map(|index, value| value ~ index.to_s).p; このary.mapの呼び出しですが、mapはイ…

二重キー

全然ネームスペースっぽくないので、メンバネームスペースという呼び方はやめて、二重キーと呼ぶことにします。 クラスメンバは、識別子(一次キー)と任意のオブジェクト(二次キー)で、二重のキー付けが出来ます。 二つ目のキーは、===演算子(同一のオブジェ…

ClassicIterator

GoFのデザパタに出てくるような、古典的イテレータメソッドを持つクラスを追加することにしました。 イテレータに対し、classicメソッドを呼び出すと元のイテレータがClassicIteratorに包まれて取得できます。 iter: 3.times.classic; for(; !iter.is_done; …

in演算子 !in演算子

範囲演算子を追加したので、あわせてin演算子を導入することにしました。 x in range というin演算子は、x.op_in#(range.class)(range) というメソッド呼び出しと等しくなります。 x !in range は !(x.op_in#(range.class)(range)) と等しいです。 (5 in 0..…

範囲演算子

範囲式は範囲演算子にします。 a .. b という範囲演算子は、a.op_range#(b.class)(b, kind) というメソッド呼び出しと等しくなります。 Intに対し引数の型Intで範囲演算子を実行すると、IntRangeクラスのインスタンスが返ります。右の端点を含まない範囲演算…

範囲式を追加する

範囲式を追加することにしました。 a..b で終端を含むaからbの範囲式 a...b または a.. 範囲式で得られるオブジェクトは、Rangeクラスのインスタンスです。 RangeクラスはEnumeratorを継承しており、ブロック文を適用できたり、to_aやmap、with_indexなど、E…

数値リテラル

XtalはRubyに倣い、2進数表記を持ち、アンダーバーで数字を区切ることが出来ます。 0b1111_1111.p; //=> 255 0B_1_0000_0000.p; //=> 256 また、数値リテラルサフィックスとして、F、K、G、M、を付けることが出来ます。 Fは浮動小数点数を表します。 Kは1024…

[ボツになった構文] generator関数式

Pythonは、普通の関数の中でyieldを書くと自動的にgenerator関数となります。 Xtalはfiberを返す関数として定義する必要があるため、冗長だと思い、「generator関数式」というものの導入を考えた時期がありました。 Int::my_times: method{ return fiber{ fo…

メンバネームスペースの応用

ActionScript3では、名前空間の機能をpublic、privateなどの可触性に応用していました。Xtalでは可触性には応用しないのですが、「2項演算子」に応用します。 2項演算子は困り者 静的な型を持たない言語にとって、+や*などの2項演算子は困り者です。 a + b…

メンバネームスペース

導入することにしました。 導入理由 Xtalは、既存のクラスにメソッドなどを追加することが出来ます。 Iterator::x2: method fiber{ this{ yield it*2; } } // 次のように使える 10.times.x2{ it.p; } このように、Iteratorクラスに「要素を2倍にしてそれを…

block_catch

ブロック文の中で例外が発生したとき、その例外を握りつぶすことも可能となるような機構がなかったので追加することにしました。 bruke: class{ block_first: method{ return this; } block_next: block_first; block_catch: method(e){ // 引数としてスロー…

引数の型チェック

foo: fun(stack is StackInterface){ } foo(5); //=> ArgumentError と、書ける機能。書けるのはisだけではなく foo: fun(n > 0){ } foo(100); //=> ok foo(-10); //=> ArgumentError とか書けるというのはどうでしょう。デフォルト値は次のように書きます。…

interface

// スタックはpushとpopを持つ StackInterface: interface{ push; pop; } // 簡単のため、配列を継承してスタックを作る MyStack: class(Array){ push: Array::push_back; pop: Array::pop_back; } hoge: MyStack(); // is演算子で、interfaceと同じメンバを…

新機能を考える

考えている新機能のカテゴリです。コレはダメだろうとか、こうしたほうがとか、ご意見を募集です。

const式

書式: const expr意味: C++のconstと同じようなconst性を付与する。 オブジェクト自体が変更不可となるのではなく、const式によって得られる参照からの変更が不可能となります。 a: [0]; b: const a; a[0] = 10; // ok b[0] = 10; // const error 内部に保持…

lazy式

書式: lazy expr意味: 実際に値が必要になるまで、exprの実行を遅延する a: lazy (100 + 200).p; // この文だけでは300と表示されない。 (a + 100).p; // 遅延されていたaが評価され、300と表示され、その後に400と表示される あんまり意味を見出せないので…