x, y は0以上2^32未満の整数とし、yは0でないとする。 数式上に ${...} と書いたらECMAScriptで...の部分を評価した結果の値を表すものとする。${...} の外で a + b のように何か演算を書いた場合、それは浮動小数点数の演算ではなく、数学的な実数の演算を…
まだそんなに使い込んでいるわけではないけれど。 使う前はコールバックスタイルに比べてなにか利点あるの?別にコールバックスタイルで困らないんじゃない?って思っていたのでまとめてみる。 メリット コールバック引数が消えてすっきりする 処理1をやって…
JavaScriptのジェネレータについて思うこと - fujidigの雑記 案外そうでもなかったかもしれない。一個一個の関数を扱いにくいジェネレータ関数のまま放っておくのではなく、継続を引数にとる普通の非同期関数化してしまえばいいんだ。お題は、これを出力する…
JavaScriptのジェネレータとDeferredを組み合わせるといい感じ! (JS1.7のyieldでharmonyのawait式ぽいことをする) - fujidigの雑記 でいったことをライブラリにしてみました GitHub - fujidig/deferred-generator まだ実際に使ってみていないので便利か分…
repl.it経由でtraceur-compilerを知った。そしてharmonyにはawait式というものがあるということを知った。 function deferredTimeout(delay) { var deferred = new Deferred(); setTimeout(function() { deferred.callback({ called: true }) }, delay); ret…
JSDeferredのcancelだと目的のことはできなくて、それは構造上無理なんだろうなーと。 で、こんなのを書いてみたものの使いにくい。 https://gist.github.com/1200041 function Trampoline(func) { this.task = new Task(func); } Trampoline.prototype.step…
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を使って値とnextが多値で帰ってくるようなgeneratorを作ってみようとしたら予想以上に難しかった。はじめはset!なしで書こうとしたんだけど出来なさそうだった。思いつかないだけでなにか方法があるかもしれないけど。 (define (generator func) (de…
とりあえず 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->…
追記 (2014/3/21) 以下がこの記事に対する自分の答えになります JavaScriptのジェネレータとDeferredを組み合わせるといい感じ! (JS1.7のyieldでharmonyのawait式ぽいことをする) - fujidigの雑記 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 …
追記 (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)…
こんなスクリプトが動きます。 #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 では goto などで関数の内部に外側から簡単に入ったりできる。そのために仮引数やローカル変数の参照、代入や return がその関数がスタックトップの状態で実行されるかということが静的には分からない。でも、明らかに不正な方法で関数内部に入ってくる…
環境: 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…
883840239413745673888484367614071057790536685391943120866342686853088554088962741529800523812714432924482598710613913144352575140063676571506082961578643064214433481064949969375249999 / 88817841970012523233890533447265625000000000000000000…
デモ <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 で矢印キーを受け取るサンプルです。矢印キーに対応して四角が動きます。 http://www.fujidig.com/misc/js/canvas/keymove1.html window.addEventListener('load', function() { var canvas = document.getElementById('game-screen'); var x = 50, y…