OCaml

Haskellのリスト操作をOCamlに移植(3)

30分プログラム、その344。昨日に引き続き、http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.htmlの関数をOcamlに移植。これで最後。 使い方 # unzip [(1,2);(3,4)];; - : int list * int list = ([1; 3], [2; 4]) ソースコード let re…

Haskellのリスト操作をOCamlに移植(2)

30分プログラム、その343。昨日に引き続き、http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.htmlの関数をOcamlに移植。OCamlってtakeもないんだぜ・・。 使い方 # take 3 [1;2;3;4;5];; - : int list = [1; 2; 3] # drop 3 [1;2;3;4;5…

Haskellのリスト操作をOCamlに移植(1)

30分プログラム、その342。たまにはProject Euler以外も。 Haskellの関数、特にPreludeにあるようなやつは実に考えられている。例えば、foldl1あたりは簡単に書けるのに、かなりいろんなところで使えて便利だったりする。 というわけで、このあたりの関数をO…

JaneStreet coreを使ってみた

多相なSetが使いたかったので、Janestreet coreを試してみた。一番分かりやすい変化は、mapとかがラベル付き引数を取るようになっている。 val map : 'a list -> f:('a -> 'b) -> 'b list なので標準ライブラリと同名でインタフェースが違うモジュールがたく…

多相Setが欲しい

標準のSetモジュールは型が固定されてしまうので、使いづらい。 多相なSetは無いのかなぁ、と探してみたらJane Street CapitalのCoreライブラリには含まれていた。さすがだ。 多相Setだけのために使うにはちょっと大きすぎるかなぁ、と迷い中。GODIにも「god…

コマンドラインからGODIを使う

いままで、GODIは対話的にしか使えないとおもってたら、実はコマンドラインから直接使えた。ただ、検索機能がないっぽいので、grepとかと組合せないといけないかもしれない。 # 一覧出力 $ godi_console list # OUnitのインストール $ sudo godi_console per…

doubleを整数に変換したい(バイトコード的な意味で)

IEE 754倍精度浮動小数をバイト列にエンコードしたい。Cとかなら簡単に変換できるのだけども、OCamlでやる方法が分らない。 union { long n[2]; double f; } x; x.f = 42.0; // x.n[0]とx.n[1]がエンコードされたやつ ちゃんと仮数部と指数部を抜きだして、…

レコードでも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みないなネタもあ…

ocamlbuildプラグイン

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

OCamlのintは31ビット

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

ためしてみよう、スタックトレース(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/ テスト…

ActionScript3 Bytecodeを手書きしてみた

http://wiki.libspark.org/wiki/AVM2/Overviewを参考に、ABC(ActionScript3 Bytecode)を手書きしてみた。 動機は、 ABCを出力するコンパイラを作りたい! u30とかのABCの基本データ方を扱えるモジュールがいるから、作った テストするために、バイトコードを…

Problem19

30分プログラム、その285。Problem 19 via Project Euler。 次の情報が与えられている。 1900年1月1日は月曜日である。 9月、4月、6月、11月は30日まであり、2月を除く他の月は31日まである。 2月は28日まであるが、うるう年のときは29日である。 うるう年は…

ocaml.jp

http://ocaml.jpOCamlの事実上日本の公式ページであるhttp://ocaml.jpがリニューアルされました。詳しいことはメーリングリストでアナウンスされるんじゃないかと思います。 あとOCamlのページなのに、PukiWikiを使っていることは気にしないほうがいいと思い…

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

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

Problem14(3) -64bit-

30分プログラム、その280。osiireさんのアドバイスを試してみる。 知ってるとは思うけど、64bitCPUならOCamlのintは63bitまで使えますよ。 bigint使わなくても解けたりしない? iMac G5だから64ビットのはずなんだけどなぁ、と思いつつ調べてみると、コンパ…

Problem14(2) -BigInt-

30分プログラム、その279。Problem14 3n+1問題の続き。 昨日のプログラムにPrintfをしこんで追いかけてみると、一部でオーバーフローが発生しているため値が収束しなくなっていた。 そこで、OCamlの任意精度整数ライブラリ、BigIntモジュールを使ってみた。…

Problem14(2) -動的計画法-

30分プログラム、その278。Problem14 3n+1問題の続き。 wikipedia:コラッツの問題の図を見ていたら、1まで計算する必要がないことに気がついた。例えば、20と21の場合、 20->10-> 5->16-> 8-> 4-> 2-> 1 21->64->32->16-> 8-> 4-> 2-> 1 のようになるので、1…

Problem14(1) - 力づく

30分プログラム、その277。3n+1問題 via Project Euler。 正の整数に以下の式で繰り返し生成する数列を定義する。 n → n/2 (n が偶数) n → 3n + 1 (n が奇数)13からはじめるとこの数列は以下のようになる。 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 113か…

OptionParserを試す

30分プログラム、その232。ExtLibのOptParseを試してみる。 なかなかいいね。標準のArgと違って、Unixのロングオプション(--long=XXX)とショートオプション(-l XXX)を同時に設定できるのが気にいった。 オプションの取得がちょっとだけ面倒かもしれない。 ソ…

ExtLibを使う

30分プログラム、その231。OCamlの便利ライブラリ、ExtLibを使ってみる。 なかなか便利そうな関数が揃ってる。とりあえず、Std.printとStd.input_allは気にいった。そのうち、OptParseを試してみたい。 でも、インストールにそここそ時間がかかったので、今…

データフロー変数

30分プログラム、その227。Mozartのデータフロー変数をOCamlで作ってみる。 最近読んでいるガウディ本(asin:4798113468)で使われているMozart/Ozにはデータフロー変数というおもしろい変数がある。 これは未束縛の変数を使おうとしたらそのスレッドは停止し…

括弧を省略できるa..b記法

30分プログラム、その224。昨日のa..b記法のバージョンアップ。 (0 .. 10)のように必ず括弧が必須だったが、0 .. 10のように括弧を省略できるようになった。 ただ..の両辺のスペースが省略できないのはしょうがない気がしてきた。パーサレベルでは浮動少数か…

rangeのための略記法

30分プログラム、その223。rangeのための略記法をCamlp4で作ってみた。 1..3とrange 1 3を同じにしたかったのだけれど、(1 .. 3)にしないとできなかった。なにか解決法あるのかなぁ。 使い方 let (@@) f g = f g (* rangeをここで定義する必要がある *) let …

Camlp4を試す

30分プログラム、その222。Camlp4を試してみる。 前やろうとして放置していたので、再チャレンジ。チュートリアルを流し読みしていたら時間が来たので、今日はサンプルだけ。 使い方 $ ocamlc -pp "camlp4o pa_extend.cmo q_MLast.cmo" -I +camlp4 -c repeat…

プログラミング in OCaml

プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~作者: 五十嵐淳出版社/メーカー: 技術評論社発売日: 2007/11/29メディア: 単行本(ソフトカバー)購入: 11人 クリック: 169回この商品を含むブログ (51件) を見る読み終った。読みやす…

多相なprintを求めて -その3-

30分プログラム、その203。多相なprintシリーズの最後。リストに対応した辺りで、ExtLibのStd.Printを知ったので、ここで終了。 使い方 # to_string [1;2;3];; - : string = "[1; 2; 3; ]" ソースコード let ($) f g x = f (g x) let (@@) f g = f g let to_…

match withとObj.tag

open Obj let f x = match tag (repr x) with | int_tag -> "<int>" | string_of_int -> "<string>" とやると、 let f x = match tag @@ repr x with | int_tag -> "<int>" | string_of_int -> "<string>";; Characters 468-481: Warning U: this match case is unused. | string_of_in</string></int></string></int>…