Math.floor(x / y) は常に期待する値になるか

x, y は0以上2^32未満の整数とし、yは0でないとする。 数式上に ${...} と書いたらECMAScriptで...の部分を評価した結果の値を表すものとする。${...} の外で a + b のように何か演算を書いた場合、それは浮動小数点数の演算ではなく、数学的な実数の演算を…

Deferredのコールバックスタイルと比較したメリット/デメリット

まだそんなに使い込んでいるわけではないけれど。 使う前はコールバックスタイルに比べてなにか利点あるの?別にコールバックスタイルで困らないんじゃない?って思っていたのでまとめてみる。 メリット コールバック引数が消えてすっきりする 処理1をやって…

for (var v in nantoka()) yield v とか書かなくちゃいけなくね問題

JavaScriptのジェネレータについて思うこと - fujidigの雑記 案外そうでもなかったかもしれない。一個一個の関数を扱いにくいジェネレータ関数のまま放っておくのではなく、継続を引数にとる普通の非同期関数化してしまえばいいんだ。お題は、これを出力する…

JavaScriptのジェネレータとDeferredを組み合わせたライブラリ

JavaScriptのジェネレータとDeferredを組み合わせるといい感じ! (JS1.7のyieldでharmonyのawait式ぽいことをする) - fujidigの雑記 でいったことをライブラリにしてみました GitHub - fujidig/deferred-generator まだ実際に使ってみていないので便利か分…

JavaScriptのジェネレータとDeferredを組み合わせるといい感じ! (JS1.7のyieldでharmonyのawait式ぽいことをする)

repl.it経由でtraceur-compilerを知った。そしてharmonyにはawait式というものがあるということを知った。 function deferredTimeout(delay) { var deferred = new Deferred(); setTimeout(function() { deferred.callback({ called: true }) }, delay); ret…

JavaScriptで非同期処理の途中で中断したいよぉお

JSDeferredのcancelだと目的のことはできなくて、それは構造上無理なんだろうなーと。 で、こんなのを書いてみたものの使いにくい。 https://gist.github.com/1200041 function Trampoline(func) { this.task = new Task(func); } Trampoline.prototype.step…

Lazy K方式のYコンビネータは分かりやすいなー

Lazy Kで再帰をしようとしたら以下のようなイディオムを使うんだけど ;; fact ((lambda (x) (x x)) (lambda (self) (lambda (n) (if (zero? n) 1 (* n ((self self) (- n 1))))))) このイディオム部分をくくりだすとそれがYになる (lazy-def '(Y f) '((lambd…

call/ccの練習でgenerator作ってみる

call/ccを使って値とnextが多値で帰ってくるようなgeneratorを作ってみようとしたら予想以上に難しかった。はじめはset!なしで書こうとしたんだけど出来なさそうだった。思いつかないだけでなにか方法があるかもしれないけど。 (define (generator func) (de…

Lazy K触り中

とりあえず What's your name? >Hoge Hello, Hoge.的なプログラムを書いた。 面白いね (load "../lazier.scm") (load "../prelude.scm") (load "../prelude-numbers.scm") (define (string->expr str) (case (string-length str) ((0) 'i) ((1) (last-char->…

JavaScriptのジェネレータについて思うこと

追記 (2014/3/21) 以下がこの記事に対する自分の答えになります JavaScriptのジェネレータとDeferredを組み合わせるといい感じ! (JS1.7のyieldでharmonyのawait式ぽいことをする) - fujidigの雑記 JavaScriptにジェネレータってあるじゃないですか。それを…

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)…

HSP on JS のモジュール変数

こんなスクリプトが動きます。 #module mod_human m_name #modinit str name m_name = name return #defcfunc new_human str name, local instance newmod instance, mod_human, name return instance #defcfunc human_get_name modvar mod_human@ return m_…

明らかに関数の内部に不正な方法で入ってくることがない関数を静的に調べたい

HSP

HSP では goto などで関数の内部に外側から簡単に入ったりできる。そのために仮引数やローカル変数の参照、代入や return がその関数がスタックトップの状態で実行されるかということが静的には分からない。でも、明らかに不正な方法で関数内部に入ってくる…

Webkit Nightly Builds (r39088) で setTimeout 内で canvas 2d context の fillText メソッドを呼んでも何も描画されない

JS

環境: WebKit-r39088 (Windows XP Home SP2) デモ: http://www.fujidig.com/misc/js/canvas/safari-canvas-text.html <html lang="ja"> <head profile="http://purl.org/net/ns/metaprof"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </meta></head></html>

モジュール変数デストラクタ呼び出しを消した

理由 高速化の邪魔になるから 別の変数から参照されているのにデストラクタが呼び出されるのは不自然に感じるから あっても嬉しいことがなさそう struct 型の値に newmod されたときのものか(それともクローンか)というフラグを持たせるのが気持ち悪い del…

裁判員になる確率は1/100です - www.textfile.org

883840239413745673888484367614071057790536685391943120866342686853088554088962741529800523812714432924482598710613913144352575140063676571506082961578643064214433481064949969375249999 / 88817841970012523233890533447265625000000000000000000…

Firefox 3.1 beta 1 で display: none な iframe 内の canvas 2d context の font プロパティに代入するとエラーが出る

JS

デモ <meta charset=utf-8> <title>Firefox 3.1 beta 1 で display: none な iframe 内の canvas 2d context の font プロパティに代入するとエラーが出る</title> <script type="text/javascript"> window.addEventListener('load', function() { var iframe = document.createElement('iframe'); iframe.setAttribute('width',</meta>…

canvas で矢印キーを受け取るサンプル - フォーカスが当たっているときにキーの動作を奪ってページがスクロールしないように

JS

canvas で矢印キーを受け取るサンプルです。矢印キーに対応して四角が動きます。 http://www.fujidig.com/misc/js/canvas/keymove1.html window.addEventListener('load', function() { var canvas = document.getElementById('game-screen'); var x = 50, y…