OCaml

OCaml Ada interoperability

adaside.ads *1 with System.Storage_Elements; package adaside is subtype Value is System.Storage_Elements.Integer_Address; use type Value; function caml_string_length (S : Value) return System.Storage_Elements.Storage_Count; pragma Import (…

Not_found

OCamlのコードを書くときにいつも迷っていることを書いてみます。超初心者質問。いい知恵ください。Not_foundの扱いです。コンテナにデータがあった場合→データを使う、と無かった場合→データを新規に作る、で分岐する処理は頻出すると思います。まず普通にi…

OCamlの関数をCのスレッドで呼ぶ方法がわかった

困ってる人を見かけたのでトラックバック。 ちょうど最近、GLCamlのSDL_audioを使えるようにしたところです。使うアテもなかったのですが、ちょうど良かったです。https://github.com/ytomino/glcaml/blob/master/lib/sdl_audio_stub.ccaml_c_thread_registe…

Debianのmingw32-ocamlをDarwin上でビルドしてみた

Debianにはyumというパッケージシステムがありまして、これがmingw32をターゲットにしたクロスコンパイラを取り揃えているのです。すごい。binutilsやgccは元々クロス開発ができるように作られていますので、各自でクロスコンパイラを野良ビルドするのも楽勝…

ocamlbuildのメモ

参考URL: http://brion.inria.fr/gallium/index.php/Using_an_external_library酷評されているocamlbuildを使ってみましたので忘れないうちにメモ。その1main.mlがあったとします。 $ ocamlbuild main.native_buildという作業ディレクトリが作られて、なんや…

Pervasives.( = )は自力定義できるか?

そういう話をしたのを思い出しましたので、OCaml Meeting 2010 in Nagoyaの聴講メモを書く代わりにやってみました。ていうか何聴いたかうろ覚えですすみません。

ちなみに正攻法は

参考: http://groups.google.co.jp/group/fa.caml/browse_thread/thread/75a8815a6b511e72/上記コードを参考URLの正攻法で書き直すとこうなります。 module type P = sig type t val compare: t -> t -> int val create: unit -> t val empty: t end module …

module type of

3.12.0出ましたね!MacPortsになかなか来ないので、ローカルでビルドして移行中です。 さて今回新機能目白押しです。その中でも個人的に一番ありがたいのがmodule type ofです。面倒くさいsig宣言のコピー&ペーストをかなり削減できます。 頻繁に弄ってる最…

個人的に再発明ブーム

なので、既にあるインターフェースライブラリをいろいろ作り直しています。今日はGMP, MPFR, MPCインターフェースを再発明しました。ただ私がGMPのインターフェースを作ると毎回毎回演算子が全部揃わないという難点が……。 http://panathenaia.halfmoon.jp/al…

無限リスト

↑とは直接関係ないのですが、私は何年かに1度は無限リストが無いと死ぬ病にかかります。今更感炸裂ですので耳タコの方は戻るボタンをお押しください。所謂(「ハンドル」または「OOP」風の)ストリームに対する無限リストのメリットはいろいろあると思われるの…

YAMLの読み書き

そういえばちょっと前に作ったものがありましたので紹介しておきます。libyamlを使うYAMLマッパーです。必要なもの。 libyaml *1 http://panathenaia.halfmoon.jp/alang/ocaml/ のyaml-ocaml *2 .dfm*3の読み書きをしようとしたときの副産物ですので余計なも…

オーバーロードが解決されるルール?

どうもこんばんは。G'Camlの路上販売を試みたものの巨大資本の前に敗れ去り、港*1で海を眺めているYTです。型レの発表内容について、id:camlspotterさんに補足いただきました。ありがたや。 Obj.magic(またはassert false)を使わないで済む構造など、非常に…

G'Camlの販促です。

どうもこんばんは。この不況の折路頭に迷うことになり、G'Camlの路上販売に商売替えをしたYTです。 今日はモニタの前の皆様に、G'Camlの型レベルプログラミング能力についてご紹介したいと思います。まず、G'Camlの型レベル言語はチューリング完全であるそう…

思い出したようにformatネタ

format/format4/format6は、内部表現stringのままらしい。Obj.magicで元の文字列を取り出せます。 # let fmt = ("%d" : ('a, 'b, 'c, 'd, 'e, 'f) format6);; val fmt : (int -> 'a, 'b, 'c, 'd, 'd, 'a) format6 = <abstr> # (Obj.magic fmt: string);; - : string</abstr>…

型計算は

まあ↓な感じでできるのでしょうけれど # type 'a num = unit;; type 'a num = unit # let incr ((): 'a num): ('a num) num = ();; val incr : 'a num -> 'a num num = <fun> # let zero: unit num = ();; val zero : unit num = () # let decr ((): 'a num num):</fun>…

多相バリアント

アップキャスト/ダウンキャストのメモ。 # type super = [`a | `b | `c];; type super = [ `a | `b | `c ] # type sub = [`a | `b];; type sub = [ `a | `b ] # ((`a : sub) :> super);; - : super = `a # match (`a: super) with #sub as x -> x | `c -> as…

そういえば書こうとして書いてなかったリロケーションエントリの減らし方

ocamloptは式中に複数回タプルやレコードの生成が出てきたらひとつのメモリーブロックとしてまとめてアロケートする最適化を行うので、場合によってはレコードを丸ごと作り直す方が、mutableをひとつずつモリーアロケートは結構な数の外部シンボルを参照する…

3.11ではflexlinkが必須になっていました

ocamlmklibもWindows版に付いてきてますし、使用できるライブラリが増えるといいですね。 ……などとわくわくしてたら、ちょっと大き目の.oで早速引っかかってしまいました。 flexlinkのソースのcoff.ml if (int32 buf 36 &&& 0x01000000l <> 0l) then (Printf…

プロジェクトらしくしてみた

http://code.google.com/p/castling/最近まともになってきた気がするので、ドキュメントなんかを整備してそれっぽくしてみました。 英語で書き始めて途中から日本語になっているのは私の根気の顕れです。全部英語に直したらOCamlのニュースグループかメーリ…

3.11.0

出てた。 出てたはいいのですが、リリースノートがまだ無いため変更点がわかりません。 とりあえずprivate int?追記 一日経ったらリリースノートできてました。 http://caml.inria.fr/pub/distrib/ocaml-3.11/notes/

O'Camlのソースを出力する時の無難なFormat

どっかに一覧無いですかね。 試行錯誤したところmatchならこんな感じで上手くいくようですが、マイナスのインデント幅を指定しているのがどうにも。 @[match @[...]@ with@] @;<1 2> @[<b2>@[<hov-2>... ->@]@ @[<hv>...@]@] @ | @[<b2>@[<hov-2>... ->@]@ @[<hv>...@]@]</hv></hov-2></b2></hv></hov-2></b2>

まあそんなことより、普通に負けててショックなんですが

yt@THALES /d/Programming/tests/grass $ time let/let.byte.exe quine2.grass > z2 real 0m1.712s user 0m0.010s sys 0m0.010s yt@THALES /d/Programming/tests/grass $ time let/let.opt.exe quine2.grass > z1 real 0m0.151s user 0m0.020s sys 0m0.000s↑…

Castlingちまちま更新

位置情報はパーサでは持ち運ぶだけで中身関与しないので多相型にした。これでファンクタの引数がトークンのみになった。 現在位置を値として記録するpositionだけだとocamlcのようなエラーメッセージ中の範囲表示に対応できないので、position_withを追加。r…

OCamlのライブラリをコンパイルする正しい方法

もしOCamlのライブラリを拾ってきても、原則として添付のconfigure/Makefileは信用してはダメです。自分でコンパイルしましょう。さもないと後々トラブルに見舞われることでしょう。OCamlのライブラリ界隈はそんな感じです。 ここでは、既存のlibnice.aを使…

正しくdll*.dllをリンクするたったひとつの方法

flexlinkを使う。 gcc -sharedもdlltoolもgnatdll*1も全部ダメ。たまたま動いたとしてもそれは奇跡に過ぎませんでした。正しくはflexlinkを使う。 詳しくはまた今度書きます。 追記(自分用メモ) flexlinkを使っても、dllbigarrayの関数とか呼べて無いような……

OCamlSDLを使えるようにした

http://panathenaia.halfmoon.jp/alang/ocaml.htmlhttp://panathenaia.halfmoon.jp/alang/gcc-private-build/ とりあえずsmpegはあきらめてますがそれ以外は全機能あるはず。 LablGLが一番の難敵でした。何故かgcc(MinGW)で作成したdlllablgl.dllとdlllablgl…

OCamlのライブラリのビルドが通らない10の理由

-whereの吐いた\r\nの\rをmakeが取り除けてない。 -sharedはまともな.dllを作らないよ!ちゃんと.defファイル書いてね!dlltool使ってね!(-sharedでも奇跡的に動く時もある)flexlinkを使わないと正しくocamlインタプリタに読んでもらえないよ!他の方法で作…

OCamlからiconv

OCamlSDLをコンパイルしようとしたら何故かiconvインターフェース作ってました。OCamlで文字コード変換するときはCamomileが一般的と思いますしそっちのほうがいいと思いますが、取り敢えず手っ取り早い風味。OCaml-iconvインターフェースは今まで無かったっ…

Google Codeを借りてみた

http://code.google.com/p/castling/ 履歴を残したかったからなのですが、手元zipとどちらが便利なのかしらん。 ドキュメントに関してはWikiが使えるので毎回アップロードするより圧倒的に楽になるはず。元々たいして書いて無いですけども。特に何も指定して…

Ocaml-GMP

http://www-verimag.imag.fr/~monniaux/programmes.html.en mlgmpidlは無駄にbigarrayとcamlidlを必要とするのですが、こっちは特に依存無しです。しかもOCaml風にラップしてくれてます。 ただし、一部インターフェースが端折られてるっぽい。