JavaScript側オブジェクトの操作とイベントリスナーの登録さて、前回はOCamlをJavaScriptに変換するところまでやってみた。今回はJavaScript側のオブジェクトをOcamlから操作するところをやってみよう。js_of_ocaml」JavaScript側のオブジェクトを呼び出す手順としては、まずOCaml側にインターフェースを定義して、それからOCaml側にJavaScriptのオブジェクトをletで持って来て、持って来たオブジェクトに##つけてメソッド呼び出しすればいいっぽい。onloadcallback)これでwindowオブジェクトのaddEventListenerや、document(doc)オブジェクトのwritelnをOCaml側から動かせるようになった。まあ今回は面倒なのでwindowのmousedownにコールバックを設定することにして、クリックしたらdocument.writelnでhelloと書かれることにした。methの部分で、addEventListenerはJavaScriptでは、第一引数に文字列(string)、第二引数にコールバック関数を取る。}になるんだけど、OCamlではメソッドのインターフェースはカリー化された表現で行う。常に一つの引数を取る関数が連続して最後の返り値を返す、という形になる。OCamlはJavaScriptと違って静的型付け言語のため、変数の型は厳格にしなければならない。t)であり、第二引数はコールバック(unit->unit)であり、返り値はどうでもいい(unit)と宣言するわけなのだ。OCamlのunit型はCでいうvoidだという説明が良くされるのだけど、実際には値を一つしか持たない型なのでなんでも入れることが出来るvoidとはちょっとニュアンスが違うような気がする。いえ、この場合は値を返さない関数であることをunitを返すことで表現しているという感じかな。unit)、つまり引数をとらずに値を返さない関数ということになる。これ、イベントリスナーの場合は引数とる場合もあるんだけどその場合はどうするのかしら。JavaScriptとのインターフェースだからなあ。オプション引数で定義するってのもなんかダサい。OCamlはprintfの実装もけっこう無理がある仕様らしいので(参照)、このへんはあまり深くは考えない感じにしようかしら。うーん、でも気になる。すんだ、と思ったら良く考えるとjs_of_ocamlにはもともとDomとか色々便利系のライブラリが揃っていて、WebGLまで使えると言う豪華なやつだったことを思い出した。startおおなんだ。すげースッキリ書ける。