OCaml

オブジェクトを使うと普通に便利なこと

オブジェクト使うと便利なこと - soutaroにっき以前書いた記事は、まあ冗談みたいなものなんですが、ふと本当にオブジェクトの有り難みを感じることがあったのでそれを書く。OCamlのクラスでは、自分で型を明示的に書いてあげることで多相メソッドを実現でき…

コメントにしてくればいいのに

http://twitter.com/_tad_/status/1398361369 http://twitter.com/_tad_/status/1398365763 http://twitter.com/_tad_/status/1398371056 まず、別に本質的な話をしてるわけじゃないのは、最初に書いておくべきだったとは思いますが。あとOCamlでプログラミ…

オブジェクト使うと便利なこと

オブジェクト指向はどうでも良いんですけど、オブジェクト自体は、一月に一回くらい使おう!っていう気分になることがあって、それは相互再帰する関数群でmutableなデータを引き回したいとき。 let rec parse_ident buffer = ... and parse_expr buffer = ..…

OMakeをビルドする方法

ビルドしようとすると「_caml_syncが無いのでリンクできません」と怒られるので、困っていたんだけど。http://b.hatena.ne.jp/karronoli/20090118#bookmark-11718291なんとcaml_syncは使ってない関数なのでソースコードをコメントアウトすれば良いらしい。な…

ocamlbuildがいまいちな件

Cのオブジェクトとリンクする方法がわからん.結局こんな感じになった. PACKS=extLib,ocamlgraph OCAMLC=ocamlfind ocamlc -package ${PACKS} all: _build/column.o ocamlbuild -quiet -ocamlc '${OCAMLC}' -lflags '-linkpkg,-custom,column.o' main.byte …

#install_printer

晴 - Note多分、普通のプリンタの作り方だとこんな感じです。 let print_sring ppf str = Format.fprintf ppf "utf8_of_string \"%s\"" str;; #install_printer print_string;; 型が、Format.formatter -> 'a -> unitになるような関数を作って、#install_pri…

OCamlのマニュアルはRuby並

object val x :> int list = [1] val virtual mutable x : int end つーか、virtualとmutableの順序を逆にできるのはともかく、フィールドにcoersionが書けるってこれ意味わかんなくないですか?

let

let x = 3 and y = 5 in x+y;; recじゃないletもandで繋げられたのか………意味は、 (fun x y -> x + y) 3 5 とだいたい同じみたい(型は違うけど)。

Formatモジュール

まあ、マニュアルを読めばわかる。自分で実装してみようと思って、よくわからなくなったので、ちゃんと動作を調べてみた。 # open Format;; # set_margin 5;; # printf "@[<hv>1@,@[<v>2@,3@,4@,5@]@]";; # printf "@[<hv>1@,@[<v>2@,3@,4@]@]";; この二つのprintfはどうな</v></hv></v></hv>…

入門OCaml

本当は発売日に紹介記事を公開しようと思っていたのですが、うっかり忘れていました。入門OCaml ~プログラミング基礎と実践理解~作者: OCaml-Nagoya出版社/メーカー: 毎日コミュニケーションズ発売日: 2007/05/22メディア: 単行本(ソフトカバー) クリック:…

pattern-mathing is not exhaustive警告がうざいからと言って、 let f x = match x with A -> ... | B -> ... ... | Q -> ... | _ -> print x; assert false とか書いておくと、あとで新らしいコンストラクタRを足したときに、忘れることがわかった。 let f …

勉強会

ノシ

.がいっぱいあるファイルをコンパイルしてみる

$ cat hoge.a.ml let a = 100 $ ocamlc -c hoge.a.ml $ ls hoge.a.cm* hoge.a.cmi hoge.a.cmo うーむ、コンパイル通っちゃった。続き。 $ ocaml -I . Objective Caml version 3.10.0+beta # #load "hoge.a.cmo";; # module H = Hoge;; Unbound module Hoge #…

どうしてOCamlのオブジェクトにはcoersionが必要だったのか

let x = object method f x = x+1 method g x = x-1 end;; let y = object method f x = x*1 method h x = x/2 end;; List.map (fun x -> x#f 3) [x; y];; 上のようなプログラムは、絶対にエラーが発生しないにもかかわらず、肩推論で弾かれる。これを通るよ…

3.10.0+beta

遅ればせながら、3.10(beta)にしてみました。ocamlbuildとか、Printf.ifprintfとか、便利そうですね。ていうか、ocamlbuildってなにこれ……orz。*1 *1:いやまあ、いかにもコンピュータサイエンティスト的なプログラムで「なんか違う」とは思うんですが。

端末の出力に色を付ける

caml-listを見て,要するに端末のエスケープシーケンスをそのまま出力してやれば良いんだとわかった.てきとーにプログラミング. type color = DefaultColor | BrightColor | UnderLineText | FlashText | BlackText | RedText | GreenText | YelloText | B…

ocamlgraph

open Graph module G = Imperative.Digraph.Abstract(struct type t = string end) module SCC = Components.Make(G) module H = Imperative.Digraph.Abstract(struct type t = string list end) module Top = Topological.Make(H) 一番難しかった(よくわか…

ほんとにモジュールはいらないか*1

module vs objectうーん…型システム的には,Polymorphic recursionがメソッドの中に出てくるようなやつは,OCamlのオブジェクトでは書けないので,と思ったけど,Moduleみたいに使うという話ならちょっと違うか.(でもこのあたりに罠はありそうな気がするけ…

http://www.lri.fr/~filliatr/ocamlgraph/

疲れてます.

open ExtLib open Format let escape_char c = match c with '>' -> "&gt;" | '<' -> "&lt;" | '&' -> "&amp;" | _ -> string_of_char c let houtput print buf pos len = let ss = String.sub buf pos len in let es = String.replace_chars escape_char ss…

json-wheel: JSON Library for OCaml

んーでもJSONの解析は,そんなにややこしくないのか. YAMLの解析は悪夢のような気がするけど.

ExtList.List.filter_mapが死ぬほど便利. type t = A of int | B of string let filter_a xs = List.filter (fun x -> match x with A i -> true | _ -> false) xs let get_a_integers xs = List.map (fun x -> match x with A i -> i | _ -> assert false)…

Macで共有ライブラリをdynamic loading

Cygwinで共有ライブラリ(*.dll)のDynamic loadingができないのは,なんとなくしかたなさそうに見えるものの,Intel Macでできないのはなんとなく納得がいかないので,ちょっと見てみた.エラーメッセージdynamic loading not supported on this platformを手…

連続するスペースを一つにする

let rec explode_string s = match s with "" -> [] | _ -> s.[0] :: explode_string (String.sub s 1 (String.length s - 1)) let implode_string cs = let s = String.create (List.length cs) in let _ = List.fold_left (fun index c -> begin String.se…

うーん、value restrictionだと危険かもしれないのかな。SMLがあれば、試せるのか。

relaxed value restriction

newってどうなってるんだろう。まずは、コンストラクタ関数(?)から。 # let new_object x = object method get = x end;; val new_object : 'a -> < get : 'a > = <fun> # let a = new_object (fun x -> x);; val a : < get : '_a -> '_a > = <obj>この挙動はOK。じゃ</obj></fun>…

OCamlの講義をするときに、リストより先に配列を出すのは、定番なんだろうか。私は、これまでに配列を使ったことがありませんが。

Noneというコンストラクタを持つデータ型を定義してしまうと、option型をどうがんばっても使えなくなる。 なにが起きてるのかわからずに、5回くらいコンパイルし直したですよ。

if-then-else

if e1 then e2 else e3かな…昔は if e1 then e2 else e3と書いてたけど、thenだけの行が気持ち悪いので、あんまりやらなくなった。

OCamlのマニュアルをWindowsのHTMLヘルプにしてみた

http://soutaro.com/ocaml-3.09.chm関数名や型名をキーワードからサクサク引けたり、全文検索できたりするので、便利です、多分。それEmacs Infoでもできるよ、とかいう突っ込みは受け付けません。これを仏教では「Emacsでどうやるかは聞いてねえよ」と言い…