OCaml

OCamlはダメか

そもそも私はよく調べないで変なことを言うのが問題だと思う.http://d.hatena.ne.jp/soutaro/20060731/1154296953の続き.まず,sumii先生のコメント. # sumii 『ええと、それはもちろんわかるのですが、それだけならOCamlMakefileやOMakeすらいらなくて、…

CygwinでUnixモジュールを使う

Unixモジュールはソケット関連とかプロセス制御とか,そういう関数が定義されているモジュールです.Unixという名前ですが,Windowsでも大体動きます*1.いわんやCygwinをや(完璧に動くらしいです).キタコレしかし,調子に乗ってCygwinでインタプリタから使おう…

Google Trends - OCaml対Haskell

http://www.google.com/trends?q=ocaml%2Chaskell&ctab=0&geo=all&date=allずっとOCamlの負けというまあ普通の結果。文京区(?)ではOCamlが圧勝しているのだが、これはなんなんだろう。東大ってどこだ?お茶大?(東京の地理が一切わからない田舎者)。フラン…

OCamlに足りないもの

506 :デフォルトの名無しさん :2006/06/25(日) 12:09:47 OCamlに足りないものってなんだろうね。509 :デフォルトの名無しさん :2006/06/25(日) 16:04:32 世話焼きの幼馴染 とりあえず型推論エラーだけ。 $ cat err.ml 1+true $ ./tuncamlc.rb err.ml Fil…

メソッドを動的に呼び出したい

CamlinternalOOを眺めていて、文字列からメソッドを得る関数が定義されていることに気づいた。これを使えば、文字列でメソッド名を与えてメソッド呼び出しを行う関数が書けるのではないだろうか。ためしに簡単な例でやってみた。 # let invoke obj f = let t…

出力順がおかしい気がする

勘違いでした。

#パターン

http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20060622#p06あれ?これexception使わなくても書けるような。調べてみたら、#なんていうパターンがあった。 # type t = [`a of a | `b of b | ... `z of z]みたいなtがあるときに、 # match x with | #…

キミならどう書く 2.0 - ROUND 1 - ― Lightweight Language Ring

http://ll.jus.or.jp/2006/blog/doukaku1 お題は「100までの整数から素数を列挙せよ」です. MLならループ使ってなんぼでしょう。愚直に。 # exception NotPrime;; exception NotPrime # begin for i = 2 to 100 do try for j = 2 to i / 2 do if i mod j = …

気が迷ってAST.mlとかにしてあったやつを、ast.mlに変更するのに、Cygwinだと一度AST1.mlにmvしてからast.mlにmvしなおさないといけないのがむかつく。さらに、Subversionを使っていると $ svn mv AST.ml AST1.ml $ svn commit $ svn mv AST1.ml ast.ml $ svn…

rename_module.rb

rename-module.rbのほうがいいかも。http://soutaro.com/hiki/?%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%CC%BE%A4%CE%CA%D1%B9%B9まあちょびっと機能強化しましたってことで。

Polymorphic Methodで遊ぶ

自分用メモ。別に面白いことは書いてありません。

限界

# class type ['a] mylist = object method map : 'b . ('a -> 'b) -> 'b mylist end;; This type scheme cannot quantify 'b : it escapes this scope.うむむ…['a] mylistを、Polymorphicに定義中に使うことができないので、'a = 'bになってしまい、そしてm…

pretty printing

プリティプリンタを書いた。これまでまったく読む気がしないくらい酷かったデバッグプリント*1が、まあ読んでやろうかというレベルになった。これで明日からデバッグが、当社比5倍くらいの速度で進むに違いない(棒読み)。OCamlのプリティプリンタは初めて書…

困った

match abc with A -> ... | B -> ... begin match xyz with X -> ... | Y -> ... end | C -> ...と書くと、べつに手続きがあるわけでもないのにbegin〜endが出てくるのが微妙に嫌で、でも括弧で括るのはもっと嫌だ。 と思っていたら、今日書いてたコードは、…

camlr4

しかし、これはこれで面白そうな気もしてきた。HTMLとか.docとか、どうがんばってもOCamlのプログラムには見えないものを処理するためのプリプロセッサ、みたいな感じ。あるいはバカの貧乏人のcamlp4。重そうだから富豪のcamlp4かな。

ra_gen_test.rb

OUnitでテストを書いていると、 open OUnit let test_abc() = ... let test_xyz() = ... let suite = "Test_ABC" >::: [ "test_abc" >:: test_abc; "test_xyz" >:: test_xyz; ]なんてコードを山のように書くことになって、リフレクションをくれえと、ぶちき…

レコードのラベル

module A = struct type t = { x : int; y : int } end let x = { A.x = 1; A.y = 2 }とモジュール名で修飾して書かなくてはいけないいけないことにめんどくささを感じて敬遠していたのだが、 module A = struct type t = Foo | Bar end let x = A.Fooとモジ…

そういえば

OCamlのオブジェクトの型推論が大堀流レコードレベルの融通の利かないものになっている理由を、PPLでGarrigue先生に尋ねたところ「abbreviationがきれいにできることを優先したから」とのことでした。納得いくような、でもPolymorphic variantと同程度の複雑…

OUnit

stringとかfloatとかintとかboolに対しては、printerがすでに用意されているOUnit.assert_equal。 let assert_eq msg expected actual = let printer x = let tag = Obj.tag (Obj.repr x) in if tag = Obj.int_tag then string_of_int (Obj.magic x) else if…

renamemodule.rb

むしゃくしゃして作った。モジュール名変えられるならなんでもよかった。今は公開している。実行すると、変更するモジュール名を聞いてきて、カレントディレクトリ以下の*.ml{i,l,y,}ファイルの中のモジュール名を変更します。変更点は、対話的に表示され、…

ぱたーんまっちんぐ

http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20060318#p02letもパターンマッチングなので、 type t = A of int | B of int;; let A i | B i = A 3;;とかできるという話。確かに便利なのですが、Variantをやろうとすると、 Warning P: this pattern…

コンパイラにType.equalが無いと怒られたので、しかたがないのでType.equalを書いていたのだが、あまりのめんどくささに、なげだしたくなった。そもそも、どういてTypeの等値性のテストが要るんだ?ああ、そうか。多相型の定義にSetを使っているから、Pervas…

self quiz

なぜ、このプログラムは型エラーになりますか? # class c = object (self) method f = (new d)#f self end and d = object method f : c -> unit = fun x -> () end;; This expression has type < f : 'a; .. > but is here used with type 'b Self type ca…

ocamlcのパーサを使う

まず、ocamlのソースコードをどっかに展開して、一度makeする。 $ tar xvfz ocaml-3.09.1 $ cd ocaml-3.09.1 $ ./configure $ make world $ make opt $ make opt.optパーサを使いたいプログラムのMakefileを適当に書く。 $ cd src $ cat Makefile OCAMLMAKEF…

3.09.1

3.09.1にアップグレード。Gentooは # ACCEPT_KEYWORDS="~x86" emerge dev-lang/ocaml # ACCEPT_KEYWORDS="~x86" emerge ounit findlib extlibしておしまい。cygwinは $ ./configure --prefix /usr $ make world <== 今ここ $ make opt $ make installGentoo…

ocamlc -pack

-packなるオプションがあることを知った。a.cmoとb.cmoからなるライブラリc.cmaを作るときに、ocamlc -a a.cmo b.cmo -o c.cmaとするとモジュール名がAとBになってしまうので、名前空間的に気に入らないと思っていたのだが、実はocamlc -pack c.cmo a.cmo b.…

うえ

exceptionでもできちゃうのか…一瞬、なにが起きてるのかわからなくなりましたが、 type exn = L1 of 'a | L2 of 'b | ...みたいな、タグがなんでもいいvariantみたいな感じなのかな、という理解。

dictionary passing

が一瞬わかったような、でもやっぱりわかるわけないか。全然知らないんだから。自動車学校は卒業できたことだし、ちゃんと勉強しなきゃ。なぜ、突然Yが出てくるのか悩みましたが、パラメトライズしておかないとprint1の中でprint2を呼べないから困るのかな、…

続き

# let f x = x#f 1;; val f : < f : int -> ’a; .. > -> ’a = <fun> # let g xs = List.map f xs;; val g : < f : int -> 'a; .. > list -> 'a list = <fun>めでたしめでたし。</fun></fun>

あんまりOCamlの話ではないのですが。先日のオブジェクトの話*1のコメントで、< name : string; .. > listがありえないという指摘をいただきましたが、そうではないと思います。これがだめなら、< name : string; .. > -> stringといった型もありえないこと…