サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
TGS2024
xtalco.hatenadiary.org
Rubyでバイナリデータを読み書きするのには、pack, unpack使うじゃないですか。 僕もねぇ、Ruby使い始めてもう何年も経つんですけど、pack, unpackっていつまでたっても覚えられないし、 使うとなんか汚い煩雑なコードになっていくんですね。そんなことってないですか? なんかライブラリないかなーとググりまして、こちらで紹介されているライブラリを一通り見てみました。 http://d.hatena.ne.jp/kenhys/20070522/1179848262 ・binaryparser ・calibre-binaryreader ・bindata ・BitStructEx しかし、なんかどれも複雑というか、いまいち直感的じゃないという気がします。 自分の理想の使い方の形は次のような感じです。 include(BinaryData) # float3要素のベクトル構造体定義
LL魂のイベントで、Rubyにもしかして機能が追加された、というジョークを聞いて以来、そのうち実装してみたいなーと考えていました。 array.langwerth と length と書くつもりが手が滑ってlangwerthと書いてしまった場合、次のように表示されるようになりました。 lib::builtin::Array::langwerth は定義されていません。'length'と間違えている可能性があります。 あるクラスのメンバが無いとき、存在するメンバ名のedit distance*1が一番近いものを求めて表示します。 edit distanceは次のようにして求めています。 void edit_distance_helper(const void* data1, unsigned int size1, const void* data2, unsigned int size2,
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 は正規表現より強力であり、よい代替手法となる。例えば、正規表現は再帰的ではないため本質的に括弧の対応付けができないが、PEG では可能である。 ↓こんな感じになる予定です。 // 整数のカンマ区切りパーサの定義 parsr: integer >> *(-"," >> integer); // 結果格納オブジェクト ret: []; // パース開始 // stdinには 5,100,6,7 と入力されるとする if(parser.parse(stdi
こういうイベントは出るのはもちろん、行くのも初めてで、とても緊張しました。こんなイベントに呼んでいただき、とても光栄でした。ありがとうございました。何か失礼なことをしてましたら、それは緊張の所為だったと言う事でお許しいただきたいです。 イベントでは、緊張であること無いこと言ってしまったのですが、時々日本語すら間違ってましたね。例えば「Luaの速度にセッパクしている」とか。 言いながら、「切迫はおかしいだろう」と思ってたのですが、代わりの単語が「緊迫」「告白」しか脳から出てこず、「まぁ「緊迫」や「告白」よりかは意味として通じるか」と判断して通しました。 こうして冷静に考えると、多分「肉薄」と言いたかったんじゃないでしょうかねー。 まあ、いろいろありましたが、今後もがんばって開発していこうと思います。Language Updateに名を連ねてもおかしくないような言語になりたいですね。 あと、会
これまで、Xtalの仮想マシンはバイトコードで動いていました。 マシンがもっとも早く読み書きできるサイズの整数を使うワードコードとどっちにしようか迷ったのですが、メモリの節約とエンディアンの違いを考慮しなくてもいいという理由から、バイトコードで作りました。 しかし、やっぱ速度の方が大切だ!と思い、マクロでバイトコードマシン<->ワードコードマシンを切り替えられるように修正しました。めっちゃ大変でした。 無事、どちらでもちゃんと動くようになり、速度を計測したところ、なんと! 6.8秒で動いてたスクリプトが、6.6秒で動くように!その差3%! ワードコードマシンだめだ… そもそもインスタンス変数へのアクセスが遅すぎるような気がしてきました。 いろいろ調べた結果、VC2005付属のSTLのvector::operatorが遅いんじゃないかという結論に達しました。 vector::operator
Xtalの仮想マシンの内部実装では、インスタンス変数へのアクセスは名前(文字列)ではなく、番号(整数)でアクセスする実装です。 Vec: class{ _x; // 0番目 _y; // 1番目 _z; // 2番目 _w; // 3番目 initialize: method(){ _x = 0; // 0番目のインスタンス変数に0を代入 _w = 0; // 3番目のインスタンス変数に0を代入 } }Ruby、Pythonなどはインスタンス変数を名前でアクセスします。 名前でアクセスする実装は、動的にインスタンス変数を追加できるという利点があります。 一方番号でアクセスする実装は アクセスが早い メモリ使用量が少なくてすむ (HashMapじゃなくて、Arrayで保持できる) インスタンス変数名をミスタイプした場合、コンパイルエラーでわかる という利点があります。 実際にインスタンス変数
結構何度も書き直してしまう関数のバインダ周りなんですが、また書き直してます。 これまでの記述方法でも書けるのですが、次のような新記法も追加することになりました。 XTAL_BIND(Vector){ Xdef_method(normalize); // このような、もっと簡単な記述方法の追加 Xdef_method(length); } また、引数の最後をArguments* または const ArgumentsPtr& とすることで、簡単に可変引数を受け取れるようになりました。 たとえばluaでは、数学系の関数をluaから使いたいという場合、 lua_State *L = lua_open(); luaopen_math(L); というように、luaopen_math()を呼ぶ必要があります。これはsquirrelでもそうだったはずです。 使わないライブラリでメモリを圧迫しないようにで
このページを最初にブックマークしてみませんか?
『新言語 Xtalを作る日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く