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

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を呼び出せ、という仕様で。これ、実際にプログ…

Map

Rubyで、Hash*1に順序がつくという実装になるかもしれないという話を聞きました。自分も色々考えた結果、「Mapは順序付きの方が使い勝手が良い」という結論に達し、XtalのMapは順序付きであることを保証することにしました。 ここでの順序とは、登録した順で…

ポインタ -> 整数

Xtalの実装を見た人は、整数(int_t)からポインタへのキャストがあることを気にしてる人がいるかもしれません。 これは一応問題が無いということになってます。int_tの定義は次のようになっており、ポインタと同じ大きさの整数が自動的に選ばれ、int_tとしてt…

PEG あれから

迷走中。配列に結果を格納するような仕様だと、memoizeの際にコストがかかりすぎるんで、Listにしてみたけども、バックトラックがすごい勢いで起こる場合以外はListのノード生成のコストの方が高くついたのでやっぱり配列に戻してみたり、駆動の部分を仮想マ…

offsetof

offsetofを使うと、gcc3.3は警告を吐くんですが、これはどうするべきなんでしょうか。

Immutableなイテレータ

Xtalのイテレータは、ImmutableであってもOKなように設計されています。 前回の説明では簡単のために、「iter_nextの最初の戻り値は次があるかどうか」、と書いたのですが、正確に言うと「次があるなら続きを返せるイテレータを返す」ということになっていま…

一文字の文字列は必ずinternされるように

しました。 さらに、小さい文字列は変数に埋め込む形にしました。 struct BASE{ enum{ SMALL_STRING_MAX = (sizeof(int_t) / sizeof(char_t)) }; struct SmallString{ char_t buf[SMALL_STRING_MAX]; }; int_t type_; union{ int_t value_; float_t fvalue_;…

棒ネコアクション

久しぶりにFlashゲームを、向こうのブログに追加しました。 棒ネコアクション http://ishi.blog2.fc2.com/blog-entry-212.htmlこれを作っていたため、Xtalのバグ修正がここ数日遅れておりました。すいません。Flash CS 3になって、大きく変わった所為でちょ…

gby

http://www.rubyist.net/~matz/20070806.html#p01 Matz日記 Groovyの(Javaにない)演算子について。「*.」や「.@」についてはどこまでうれしいのかよく分からないけど、レシーバがnilならnilを返すメソッド呼び出し「?.」や、メソッドを取り出す「.&」は、ち…

lzy

ふたたびMatzにっきより http://www.rubyist.net/~matz/20070807.html#p01 _ [Ruby] Lazy Collectionへの第一歩になるかどうか自信は無いのだが、 1.9でイテレータ系メソッドにブロックを渡さない時に返される Enumerable::Enumeratorクラスに、外部イテレー…

Xtal PEG

ちょこちょこと実装を進めています。ローカルでは、文字列分割パーサが次のように書けるところまで出来ました。 make_split_parser: fun(patt){ elem: peg::join( (peg::anych - patt)*0 ); return elem >> (-patt >> elem)*0; } split_p: make_split_parser…

libの新機能

これらの機能も0.9.7.0から入っています。libは正式に「クラスの一種である」ということにしましたので、libを他のクラスにmix-inすることが出来るようになりました。 lib::foo: 100; filelocal.inherit(lib); //定義されていない変数はfilelocalから探され…

日本語の識別子

特に禁止する理由も無いため、0.9.7.0から許可することにしました。 Foo: class{ フー: method(){ callee.p; } } Foo().フー; //=> Foo::フー

Xtal-Group

Google Groupに議論やバグ報告の場を設けました。 http://groups.google.co.jp/group/xtal-group?hl=jaもちろんこれまでどおり、この日記にコメントでの意見もOKです。

|a, b| expr;

Xtalは、fun(a, b) expr; で関数式を記述できますが、|a, b| expr;という書式でも関数を作ることが出来ます。0.9.7.0より前では、fun(a, b) expr; と |a, b| expr; に違いは無かったのですが、0.9.7.0からは|a, b| expr; の挙動を変更しました。 a, b expr; …

正規表現

Xtalは正規表現を持つ予定はありません。 正規表現の代わりに PEGのパーサ生成器 を組み込みで持つ予定でいます。WikipediaのPEGの説明ページ http://ja.wikipedia.org/wiki/%E8%A7%A3%E6%9E%90%E8%A1%A8%E7%8F%BE%E6%96%87%E6%B3%95 >利点 > PEG は正規表現…

0.9.7.1

C++レベルで、名前付き引数を二つで関数呼び出しすると停止するバグ修正

ゆろさんへの回答

返事が遅れて申し訳ありません。 Allegroとの格闘が長引いてしまいました。 0.9.5.3と、今回の0.9.7.0は、C++側の使い方が結構変わってしまいました。これも申し訳ありません。 今現在、マルチバイト文字をベースにしていますが、defineオプションでもいいの…

サンプルゲーム

サンプルゲームも今回の変更に追随するよう書き換えました。 今回からSDLを止めて、Allegroライブラリを使用するようにしました。VC8とmingwでコンパイル、実行出来るのを確認してます。

今回行ったC++側の変更

これまで、Anyという「参照を模した型」を通じてやり取りしてきましたが、今度からAnyPtr (SmartPtr) という「ポインタを模した型」を通じてやり取りするように変更しました。