2007-09-01から1ヶ月間の記事一覧

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と表示される あんまり意味を見出せないので…

first_step

ループの中で暗黙的に定義される、最初の一回はtrueとなりそれ以降はfalseとなる変数「first_step」を実装しました。 3.times{ first_step.p; } //=> true //=> false //=> false for(i: 0; i<3; ++i){ if(first_step){ "a".p; }else{ "b".p; } "!".p; } //=…

定数畳み込み、定数伝播を実装しました

マイクロベンチマークにおいては、定数畳み込みや定数伝播があっても効果が無いケースがほとんどなので放置してましたが、今回新しい機能を入れるために取り掛かりました。 a: 10 + 20 + 30; b: 4 + 5; (a+b).p; というコードは、69.p; と同じバイトコードが…

東京ゲームショウに行きました

せっかく東京に引っ越したということで、今年の東京ゲームショウに行ってみました。いやー、人多すぎです。どのブースも一時間待ちとかが当たり前なのに驚きました。 体験版を一時間待ってプレイするとかどうなんですか。自分的に無いんですけど。まぁでもせ…

fun{}.self

Xtalは、} という記号の後は後置演算子や二項演算子が継続できない仕様になっています。 そのため、fun{}()というような記述が出来ず、(fun{})() と記述する必要があります。この制限は、 foo: fun(n){ return 500; } (10 + 20).p; が意図せず 500 をpするの…

x: x;

C言語で int x = x; int y = y + 1; という変数定義をすると、xやyは不定値となります。 Xtalも同様の仕様でしたが、これで嬉しいことは何もないので、「変数定義の右側で同名の変数が出てきた場合、外側のスコープの変数を見る」という仕様に変更することに…

C++のクラスを継承可能に

上のPseudoArrayを導入する過程で、C++のクラスをXtalのクラスで継承することが可能な実装になりました。 ただし、C++のクラスは一つまでしか継承できないという制限はあり、二つ以上継承すると例外が飛びます。

PseudoArray

mapやcollect、filterなどの関数は、イテレータを返すのではなく、PseudoArrayを返す、という仕様に変更することにしました。 PseudoArrayは、生み出されたときはIteratorとして振る舞い、Iteratorに無くArrayにあるメソッドを呼ばれた瞬間からArrayとして振…

 関係演算子が右辺を返す

5 これがあると、 x: 10; if(5 < x < 20){ } と書けるのです。しかし、 n: null; if(n==null){ } が上手くいきません。

nop

やっぱnopなんて要らないかな・・・。

名前変更

イテレータが持つべきメソッドiter_first、iter_next、iter_breakをそれぞれblock_first, block_next, block_breakに変更することにしました。

each_value, values

Mapには、値を巡回するイテレータを返すeach_valueと、それを配列にして返すvaluesがあります。かなり前の仕様では、値を巡回するイテレータを返すvaluesメソッドしかありませんでした。配列が欲しければ、to_aを呼び出せ、という仕様で。これ、実際にプログ…