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

JavaScriptで関数のソースから外部イテレータのソースに変換してくれるツールほしい!

たとえば function () { for (var i = 0; i < 3; i ++) { yield i; } }って入力すると function () { for (;;) { switch(this.pc) { case 0: this.i = 0; this.pc = 1; break; case 1: if (this.i < 3) { this.pc = 2; } else { this.pc = 4; } break; case …

JavaScript で 32bit int を扱う

JS

追記 (2014/3/21) 最近ではMath.imulというものがあります。 Math.imul() - JavaScript | MDN signed int への変換: x | 0 unsigned int への変換: x >>> 0 これで大抵の場合はうまくいく。IEEE64bit浮動小数点数では整数は2の53乗までしか正確に表現できな…

後ろで定義されている関数を呼び出せるようにするパッチ その2

後ろで定義されている関数を呼び出せるようにするパッチ - fujidigの雑記 の改良。 前のパッチは codegen で識別子の @ がどうこうしているのが心残りでした(SearchSymbolOrRegisterVarまわり)。 識別子の @ の処理とかはプリプロセスで済ますべきだったと思…

ラベル型変数を使って無理やり動的メソッド呼び出しを実現してみる

HSP

※ 黒魔術注意。この記事には実用的なスクリプトはありません。 dog_cry_impl, doc_cry と二段構成になっていて、 animal_cry を #modfunc でなく #deffunc なのは、メンバの参照時に違うモジュール内の #modfunc からジャンプしているかチェックしてそのとき…

await 命令

HSP

#uselib "winmm.dll" #cfunc global timer "timeGetTime" #module #deffunc sleep int n start_time = timer() while timer() - start_time < n ; wend return #global wait 0 sleep 100 ; 処理に 100 ms 時間かかった st = timer() await 1000 ed = timer()…

Stringify 面白い

#include <stdio.h> #define STRINGIFY1(e) #e #define STRINGIFY2(e) STRINGIFY1(e) #define FOO 1 int main(void) { printf("%s\n", STRINGIFY1(FOO)); printf("%s\n", STRINGIFY2(FOO)); return 0; } FOO 1Ruby の STRINGIZE マクロで #define STRINGIZE(expr) STR</stdio.h>…

後ろで定義されている関数を呼び出せるようにするパッチ

改良しました -> 後ろで定義されている関数を呼び出せるようにするパッチ その2 - fujidigの雑記 だいたい以下のような仕組みです。 プリプロセス時のラベル情報を使って関数の名前を type = TYPE_MODCMD, opt = -1 で登録 opt = -1 の関数の呼び出しがあっ…

C で定義されたメソッドと Ruby で定義されたメソッドで Continuation オブジェクトへの変数の保存のされ方が違う

callcc で遊んでいてローカル変数の保存のされ方ってどうなっているんだ?とふと思って試してみました。 試していたら、 C で実装されたメソッドと、Ruby で実装されたメソッドで変数の保存のされ方が違うことに気づきました。 cont = nil 10.times do |i| p…

Generator の再発明

思考実験: returnを関数と思ってみる話 - d.y.d.をきっかけにちょっぴり継続がわかりました。 そこで、Generatorを再発明してみました。 class MyGenerator class StopIteration < IndexError; end def initialize(obj, method_name=:each) @obj = obj @meth…

HSP on JS で HSP のコードから変換された JavaScript ソース

HSP on JS では AX を独自の命令列に変換した後、JavaScript のソースコードに変換しています。 どんなソースコードに変換されるのかを紹介します。 Hello, world! mes "Hello, world!"for(;;) { switch(this.pc) { case 0: // mes "Hello, world!" var func…

複数行コメント内に # で始まる行があると行番号がずれるバグを修正するパッチ

token.cpp 読みにくい。これで問題ないかなあ? Index: token.cpp =================================================================== --- token.cpp (revision 194) +++ token.cpp (working copy) @@ -3047,17 +3047,14 @@ int CToken::ExpandLine( CMe…

プリプロセッサ命令の後ろに余分なトークンがあったらエラーにするパッチ

http://hsp.tv/play/pforum.php?mode=all&num=22946#22959 を見て作ってみたんだけど微妙な感じ。 #if, #ifdef, #ifndef で実行されないブロック内ではチェックされない #enum は 「if ( GetToken() == '=' ) {」ってやってるので余分なトークンがひとつだけ…

V8 で -- array.length; より array.pop(); の方がかなり速い

JS

function strTimes(str, times) { var result = ''; for(var i = 0; i < times; ++ i) { result += str; } return result; } function benchmark(s, n) { var array = []; for(var i = 0; i < n; ++ i) { array[i] = null; } var body = ''; if((n / 50 | 0)…