2009-01-01から1年間の記事一覧
たとえば 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 …
追記 (2014/3/21) 最近ではMath.imulというものがあります。 Math.imul() - JavaScript | MDN signed int への変換: x | 0 unsigned int への変換: x >>> 0 これで大抵の場合はうまくいく。IEEE64bit浮動小数点数では整数は2の53乗までしか正確に表現できな…
後ろで定義されている関数を呼び出せるようにするパッチ - fujidigの雑記 の改良。 前のパッチは codegen で識別子の @ がどうこうしているのが心残りでした(SearchSymbolOrRegisterVarまわり)。 識別子の @ の処理とかはプリプロセスで済ますべきだったと思…
※ 黒魔術注意。この記事には実用的なスクリプトはありません。 dog_cry_impl, doc_cry と二段構成になっていて、 animal_cry を #modfunc でなく #deffunc なのは、メンバの参照時に違うモジュール内の #modfunc からジャンプしているかチェックしてそのとき…
#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()…
#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 の関数の呼び出しがあっ…
callcc で遊んでいてローカル変数の保存のされ方ってどうなっているんだ?とふと思って試してみました。 試していたら、 C で実装されたメソッドと、Ruby で実装されたメソッドで変数の保存のされ方が違うことに気づきました。 cont = nil 10.times do |i| p…
思考実験: returnを関数と思ってみる話 - d.y.d.をきっかけにちょっぴり継続がわかりました。 そこで、Generatorを再発明してみました。 class MyGenerator class StopIteration < IndexError; end def initialize(obj, method_name=:each) @obj = obj @meth…
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() == '=' ) {」ってやってるので余分なトークンがひとつだけ…
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)…