メモ

変数回りの整理

変数回りの仕組みで、頭がごちゃごちゃしてきたのでちょっと整理してみる。 実現方法 変数はAVM2では、スコープオブジェクトのプロパティで実現する スコープは、いくつか積み重ねれる。スコープチェーン? スコープチェーンからプロパティを持つオブジェクト…

GetOuterScope

クロージャがなかなか実現できないので、0xEDで直接、バイトコードをいじって色々試してる。どうも、AVM2に載ってない謎の命令、getouterscopeが鍵っぽい。

Tamarinデバッグビルド

いままで、「Tamarinデバッグビルドはどうせ、Tamarin本体を開発する人以外には関係ないだろ」と思っていたけれど、意外と便利。 特に、"-Dverbose"と書くとコンスタントプールの中身やスタックの変化とかを出力してくれて、相当便利。 mac 23:25:26 $ avmpl…

スコープの管理

AVM2のスコープ管理についてメモ。相当賢く管理してて、簡単にクロージャを実装できるようになっている。まずは基本。 スコープはスコープスタックという専用のスタックで管理されている スコープ・スタックには任意のオブジェクトを積める。そして、ECMAScr…

レコードでもliftしたい

こんないくつかの値をまとめて扱うためにレコードを定義した。 type some_record = {x:int list;y:float list} そして、これを操作する関数をいくつか書いた。 let append {x=x1;y=y1} {x=x2;y=y2}= {x=x1@x1; y=y1@y1} こういった関数がいくつかできてくる…

OCamlでCpp

たまに、OCamlでも型を無視して字句的な操作をしたいことがある。そういうときはcamp4を使うのが正統な方法だろうけど、そこまで頑張りたくないときはCpp(C PreProcessor)を使うと便利。http://alohakun.blog7.fc2.com/blog-entry-459.htmlみないなネタもあ…

関数関連のABC

関数に関係したABCを淡々と貼るよ。traitも調べないと無意味な予感はしてる。 サブルーチンっぽいやつ function f(){ } f(); 2 newfunction var undefined():* /* disp_id 0*/ 4 getglobalscope 5 swap 6 setslot 1 8 findpropstrict f 10 callproperty f (0…

ActionScript3にブロックスコープはない

ActionScript3にブロックスコープはない。 var x = 0; { var x = 42; } print(x); // 42が出力される。 ちなにみforやwhileもスコープを導入しない。 別にこの仕様についてどうこう言うつもりはないけれど、AVM2でどうやってブロックスコープを実現したらい…

変数関係の命令

AVM2で、どうやって変数を実現するか調査中。とりあえず、スタックの番号と名前の対応表がいる予感。 例 Flex3 SDKのasc.jarで var x=42;をコンパイルすると、 2 pushbyte 42 4 getglobalscope 5 swap 6 setslot 1が得られる。 関連してそうな命令 命令 補足…

ocamlbuildプラグイン

トップディレクトリにmyocamlbuild.mlを置くと、それがOCamlBulidのプラグインとして使える。参考たとえば、ocamlfind用のプラグインを置けば、_tagsファイルに <*.ml> or "prog.byte": pkg_nums, pkg_strのように書けるようになる。すばらしい。公式ページ…

if文関係の命令

AVM2 Overviewだと命令がABC順にならんでて読みづらいので、整理。tamarinのcore/opcodes.hだとオペコード順に並んでて読みやすいよ。 条件分岐 命令 補足 label branchするだろうところに書いておくと、本当にジャンプできるかチェックしてくれる ifnlt not…

OCamlのintは31ビット

OCamlのintは31ビットしかない。0x7FFF_FFFFが-1になるから、変だとは思ってたんだよ。 ABCでは32ビットの整数が欲しい状況がいくつかあるから、どうしよう。Int32モジュールを使えばいいんだけど、扱いが面倒そうなんだよなぁ。追記: Int32は1lみたいな記法…

みんなでOPMLを作って、共有しよう

http://howdyworld.org/opml/?TestみんなでアルファブロガーOPMLパックみたいなのを作れる、OPMLエディタ+Wikiみたいなサービスを作ったらおもしろくね?みたいな話をid:mallowlabsさんとしてた。その後、『Railsでフルスクラッチで書くのは面倒だけど、Hiki…

Project Eulerの注意書き

Project Eulerの問題ページの一番下に注意書きがあった。 NOTE: Please do not contact Project Euler if you are unable to solve a particular problem. If you can't solve it, then you can't solve it!注意: 解けなくても、メール送ってこないでね。君…

ためしてみよう、スタックトレース(stack backtrace)

JavaやLL言語ではよくある、「スタックトレース」を、OCamlでも出してみましょう。 ソース mod1.ml(例外が発生): let test () = (function (a::_) -> a) [] mod2.ml: let test () = Mod1.test () main.ml: let _ = Mod2.test () debug.ml (* スタックトレー…

OUnitの使い方

OCamlのユニットテストフレームワークのOUnitの使い方。基本的にはHaskellのHUnitと同じらしい。 環境 GODIでOUnitをインストールしてある。OCamlのバージョンは3.10で。あと、ディレクトリは以下のような構造をしている。 ディレクトリ名 用途 src/ テスト…

GitHubでアバター画像を設定したい

GitHubのSource Browserなどで表示されるアバター画像の設定でつまったので、メモ。まず、Gravatar - Globally Recognized Avatarsでアバター画像を設定する。Operaだと、うまくアップロードできなかったので、Firefoxを使った。次に、GitにGravatorに登録し…

git submodule

http://d.hatena.ne.jp/woremacx/20080308/1204986198のように、gitで外部レポジトリを扱えるようにする方法。 外部レポジトリの追加 git submodule addすると、外部レポジトリをサブモジュールとして取り込めるようになります。 # cloneする $ git clone gi…

ELPA

id:rubikitchさんから、『CPANコマンドのEmacs版はELPAだよ』という趣旨のメールをいただきました。 インストールが*scratch*にLispコードを実行するだけあたりが実に素敵。ただ、残念ながら登録されているパッケージが少なくて、必要なやつが全然ない。その…

AVM2での関数呼び出し

ABC(ActionScript3 Bytecode)で、関数をどのように呼び出しているかのメモ。 print("Hello,world!!"); をダンプすると次のバイトコードが得られる。 6 findpropstrict print 8 pushstring "Hello,world!!" 10 callproplex print (1) 13 pop finpropstrictで…

mzp_at_ocaml.jp

mzp_at_ocaml.jpでメールが届くようになりました。格好いいっ。

ABCのバイトコード生成

ABC(ActionScript3 ByteCode)をどうやって生成しているか気になったので、Tamarinのソースツリーに含まれているECMAScript4のコード生成部分を追ってみた。 とりあえず、何もせず終了するだけのプログラムを生成するときのことを想定している。要するに空の…

Tamarinのビルド

オープンソースのActionScript3 VMのTamarinのビルド方法。参考: http://developer.mozilla.org/en/docs/Tamarin_Build_Documentationまず、Tamarinをレポジトリからコピーする。 $ hg clone http://hg.mozilla.org/mozilla-central mozilla-centralそして、…

id:athosの日記が濃すぎる件について

id:athosの日記が実に濃い。valuesがcall/ccで定義されているのは有名だとか言ってるよ、この人。 とても楽しく読んでいるので、どんどん続けるといいと思います。# valuesをcall/ccで定義できる理由がよく分かりません。誰か対応するcall-with-valuesを見せ…

Ubunutuのffmpegでmp3が作れない

Ubuntu 7.10の普通にapt-getしたffmpegではmp3が作れないらしい。mp3を作れるバージョンのffmpegは、MediaUbuntu向けのレポジトリで配布されている。まずは、http://blog.browncat.org/2008/02/medibuntu.htmlを参考にレポジトリを追加する。 $ sudo wget ht…

Problem14(4) -Numモジュール-

jijixiさんのアドバイスも試してみた。 jijixi 2008/04/05 00:12 『Hashtbl.hash は big_int の値に対して常に同じ値を返してしまうので、こいつをhash 関数の実装として使ってしまうと全くハッシュテーブルを使う意味がありません。かと言って、じゃあどの…

ホワイの(感動的)Rubyガイド

ホワイの(感動的)Rubyガイド BEST SOFTWARE WRITINGに要約が載っていて、なかなかしっかりしているように感じたので。 RailsやってるけどRubyが分からん、と嘆いていたhmxは読むといいんじゃないかな。 アメリカのティーンエイジャーはこれを読むと笑いころ…

Perlにコーディング規約は存在しない

BEST SOFTWARE WRITINGによるとPerlのコーディング規約というものは存在していないらしい。 たしかにGoogleで検索しても引っかからない。google:Perl コーディング規約

ビット構文がすごい

プログラミングErlangより。 Erlangのビット構文がすごい。例えば、16ビットのRGBカラーの場合、 1> <<R:5,G:6,:B:5>> = Color. 2> Color2 = <<R:5,G:6,:B:5>>. でアンパックやパックができる。 シフトやマスクでとり出すよりも断然、見やすいですよね。</r:5,g:6,:b:5></r:5,g:6,:b:5>

文字列補間がすごい

プログラミングGaucheより。 gosh> (define x 30) x gosh> #`"x is ,x" "x is 30" gosh> '#`"x is ,x" (string-append "x is " (x->string x) "") これはいい。いちいちstring-appendを使っていたのが恥かしい。