OCaml

omake + oUnitでTDD!

明日は、TDD Bootcamp名古屋です。 というわけで、自分のoUnit + omakeでTDDな環境を晒してみます。もっとクールな方法があったら教えてください>ちなみに、構築したサンプルはGitHub - mzp/ounit-example-1: OUnit exampleに置いてあります。 ディレクトリ…

Practical OCamlを手にいれた!

研究室の大掃除のおかげで、かの悪名高きPractical OCamlを手に要れました。 ブログに記事を書くという約束と引き換えに手にいれたので、あとで何かを書きたいと思います。

型でOCamlの関数を検索できるサービス、OCaml API Searchをリリースしました

http://search.ocaml.jp/はてなブックマーク- http://search.ocaml.jp/HaskellにはHoogleという型で関数を検索できるグレイトな検索エンジンがあります。関数型言語では、欲しい関数の型がなんとなく分かることが多いので、こいつがものすごく便利です。でも…

OCamlでダイクストラ法

30分プログラム、その692。OCamlでダイクストラ法。 "OCaml ダイクストラ法"でググると、昔ボクが書いた不完全な実装がヒットしてしまう。(ダイクストラ法を実装しようとしたら、よくわからないものになった - みずぴー日記) この不完全な実装を放置するのは…

pa_field: {foo}を{foo=foo}にするCamlp4拡張

将来のOCamlで{foo = foo}のかわりに{foo}と書けるようになるかも、というウワサがあるらしいです。 ステキな機能ですね。ここ最近、 let f {foo=foo;bar=bar;baz=baz} = ... みたいなコードをずっと書いてて嫌になってきたので、Camlp4で実現してみました。…

正規表現ライブラリ書きました

暑いなー、と思って部屋でごろごろしてたら、いつのまにか正規表現ライブラリを書いてました。なにがおこったか、(ryまだ、直したいところがいくつかありますが、とりあえず動くようにはなったので公開しときます。 使い方 シグネチャはこんな感じ。 val reg…

OCaml Meeting Tokyo 2009があるらしいよ

Users Meeting - OCaml.jp OCaml Meeting Tokyo 2009 : ATND そこで、日本の OCaml ユーザーの情報交換と親睦を計るために、 OCaml Meeting Tokyo 2009 の開催を提案します。大 学、産業関係者だけでなく、ホビーユーザーも含め、研究から応用事例まで幅の広…

ならしコストによるQueueを実装した

なんとなくならしコストによるQueueを実装してみたので、貼っておきますね。 シグネチャは、標準のQueueモジュールに、ある程度そろえてあります。 http://gist.github.com/113468

OCamlでプロファイリング

30分プログラム、その585。OCamlのプロファラを試してみよう。 マニュアル曰く、実行したときに何回関数が呼ばれたか、何回条件分岐が行なわれたかを記録できるらしい。どうも、各関数に何秒かかったか、などの情報は取れないらしい。 1.コンパイル とりあえ…

SuffixArray

30分プログラム、その580。id:Gemmaさんに借りたWEB+DB PRESS Vol.50に、suffix arrayの解説が載っていたのでやってみた。 解説を読んだときは「ちょう簡単じゃん。さくっと実装してやんよ」と思っていたけど、いざ始めたけど、けっこう大変だった。簡単とか…

RE:いろんな言語でオブジェクト指向的Hello World

http://d.hatena.ne.jp/Yuichirou/20090414#1239705258書かないといけない気がしたので。 class welcome name = object method get_name = name method say = Printf.printf "こんにちは、%s!\n" name end let welcome = new welcome "世界" in welcome#say

OCaml-Java + GAE = ?

Google App EngineでJavaがサポートされた。 で、これとThe website has movedを組合せたらGoogle App EngineでOCamlが使えるんじゃないだろうか、という妄想。

OCamlでもbegin ... endを使うとRubyっぽくなる

OCamlでは( ... )のかわりにbegin ... endが使える。 なので、これを使うと次のよように書ける。 let map x f = List.map f x let xs = map [1; 2; 3;] begin fun x -> x * x end おお、まるでRubyのようではないか。

OUnitの結果をHTMLに

30分プログラム、その557。OUnitの結果をHTMLしてみる。 OUnitは便利なんだけど、結果の出力がテキストだけなので、ちょっとさみしい。JUnitみたいな感じでカラフルに表示して欲しい。 というわけで、テキストじゃなくてHTMLで結果を出力するようにしてみた…

OCamlでCompositeパターン

30分プログラム、その552。CompositeパターンをOCamlでやってみる。 OCamlのOはオブジェクトのO、オブジェクト指向と言えばデザインパターンということで、OCamlでCompositeパターンを実装してみた。 バリアント使えと言うのは野暮ってもんです。 使い方 let…

OCamlでCの関数を呼んでみよう

30分プログラム、その548。OCamlでCの関数を呼んでみよう。 OCamlバインディングの無いライブラリを使いたいときに必要になるよ。便利かどうかは分からないけど。Interfacing C with Objective Camlを参考に、階乗計算モジュールを作ってみよう。 OCaml側の…

ダイクストラ法を実装しようとしたら、よくわからないものになった

30分プログラム、その518。ダイクスラ法を実装しようとしたら、よくわからないものになった。変な点は、対象とするグラフがDAGのみになっている点と、たぶん計算量が増えてる点。もともと手続き的だったアルゴリズムを、再帰でキレイに書こうして失敗したの…

OCamlのコーディング規約

komamitsuさんのCaml Programming Guideline - komamitsu.log経由で、OCaml/guideline - U-Wiki+を知った。 OCamlのコーディング規約らしいけど、 命令型コードには1行ずつコメントを付ける while ループは普通間違っている。 といったおもしろいことが書い…

OCamlDebugが熱い

30分プログラム、その445。ふと思いついてOCamlDebugを試してみたら、予想以上に熱かった。ステップ実行や変数表示、ブレイクポイントなど普通の機能があるのはもちろんのこと、1ステップ戻るなんてことができる。逆方向に実行って、熱すぎるだろ・・・。 デ…

Schemeのdefineってレキシカルスコープじゃないよね

Schemeの場合 Schemeのdefineはset!と似た感じになるので、変数を2回defineすると最初の値が変わる。 (define x 1) (define (f) x) (define x 2) (print (f)) ;; => 2 OCamlの場合 で、みんな大好きOCamlの場合は、二回letしても最初の値は変わらない。 let …

多相バリアントと木構造

多相バリアントでも、木構造のデータ型を定義してしまうと拡張が大変だよね、というお話。 ツリー構造じゃない場合 適当にデータ型を定義するよ! type value = [ `Var of string | `String of string ] 多相バリアントだから簡単に拡張できるね、やった! t…

符号拡張がしたい

ABCをパースする際に、24ビットの整数を32ビットの整数に符号拡張したくなった。とりあえず、算術シフトをつかって実現してみた。7ビットシフトなのは、OCamlの整数が31ビットだから。 let s_extend d = (d lsl 7) asr 7 これでもいいんだけど、CPUによって…

OCamlのモナドで虫食い算

30分プログラム、その385。OCamlのモナドを試してみる。ocaml-nagoya的には、一年以上前の話題な気がするけど。 http://www.itpl.co.jp/ocaml-nagoya/?OCaml%A5%C6%A5%AF%A5%CB%A5%C3%A5%AF%2Fmonadを参考にして、pa_monadをコンパイルする。要するにダウン…

OCamlのストリームパーサーすごい

http://www.libspark.org/browser/ocaml/abc2xml/asm.ml ABCのオペコードを解析するコードを書いてます。 その部分のコードはこんな感じ。 let code = parser [< _ = op 0xc5 >] -> `Add_i | [< _ = op 0x86; index = u30 >] -> `Astype index | [< _ = op 0…

.cmiの読み込み

30分プログラム、その378。.cmiをよ読み込んで、ひらメソッドのテンプレートを生成してみたかったので、試してみた。 id:mmatsuoka:20080515を参考にしたけど、うまく欲しい情報が取れなかった。やっぱりmliをパースしたほうが楽かもしれない。 使い方 こん…

omake with camlp4

pa_ooを使ったソースコードをomakeでビルドしたかったので、いろいろ試してみた。もっと賢い方法がある気がするけど、とりあえず動くよ。 ディレクトリ構造 +-camlp4-omake/ | +-camlp4/ | | | +-OMakefile | | | +-pa_oo.ml | +-main.ml | +-OMakefile | +-…

おまけ(OMake)を試す

30分プログラム、その369。どうやらomakeがすごいらしい(id:camlspotter:20080718:1216345119)。 omake -Pによる継続ビルドとか素敵すぎる。これがあれば、fcwrapとかflymakeとかいらないんじゃね?適当にドキュメントを眺めていたら、オブジェクト指向とか遅…

タプルの第2要素にのみ関数を適用したい

タプルの第2要素にのみ関数を適用したいことがよくあると思います。Janestreet coreのTupleモジュールにはこれをやる関数が用意されています。 # Core.Tuple.T2.map2;; - : f:('a -> 'b) -> ('c, 'a) Core.Tuple.T2.t -> ('c, 'b) Core.Tuple.T2.t = <fun> # Core</fun>…

OCamlで_による桁区切り

OCamlでもPerlやRubyみたいに_で数字を区切れるんだぜ。 # 1_000;; - : int = 1000 # 1_000.;; - : float = 1000. マスクパターンみたいな数字が長くなる場合、これを使うとだいぶ読みやすくなるよ。

レコードの名前空間

モジュールAの中でレコードを宣言する。 module A = struct type t = {a:string; b:string} end 各フィールド名はモジュールに属するので、このレコードを作るには次のようにしないといけない。 let f () = { A.a="foo"; A.b="bar"; } でも、全部のフィール…