雑記帳

ちょっとした文章とかメモ書きとか。

日別アーカイブ: 2014年1月18日

GroongaのHaskellバインディングを書いた。

Groongaのドキュメントの作業のお手伝いをしていく中で、自分の好きな言語の一つであるHaskellから使えたらなんて面白いんだろう、と思ったのでHaskellバインディングを書きました。

ツイートにある通り、Haskell + GroongaHaroonga(はろんが)です。
https://github.com/cosmo0920/haroonga

Groonga(ぐるんが)のようなどっしり(?)した響きではなく、Haroonga(はろんが)だと「Haskellの世界にはろー」みたいな軽いイメージが連想されますね。(「はろー」というよりも「はろろん」みたいなもっと砕けたイメージかなと思いますがまぁ置いておきましょうか。)

HaskellでFFIを使ったバインディングを書くにあたって何種類か方法があるわけですが、その中で使った方法がc2hschsc2hsを使う方法です。この方法を取ると、c2hscがC言語のヘッダーを静的に解析し、<c言語のヘッダー名>.hscという中間形式を吐きます。こうすることにより、FFIを行うにあたって8割以上の作業は終了します。

FFIを使用する理由は何でしょうか。そうですね、FFIを使ってその言語に無いライブラリを使いたいのです。その目的を達成するのには、APIがこなれないのかも知れないけれどもツールに頼るのが良いでしょう。
幸運な事に(Glasgow) Haskellではそのやり方を推奨しているように見えます。c2hscは使い方が単純ですし、hsc2hsはwell documentedなのです。

ただ、c2hscにも弱点はあります。複雑に定義されているC言語の構造体をごく稀にパーズできないことがあります。ただこれは本当にごく稀で、そのような構造体をHaskellの世界に持っていく事に迫られるケースは多くありません。Haroongaを作る際にもgrn_obj構造体の扱いに悩みましたが、これはあくまでもHaskell側からは型のみを取り出して中身はブラックボックス(Haskell側ではアクセスする手段を提供しないが、Haskellの世界にgrn_obj構造体に当たる型が存在する)、とする事に落ち着きました。

それにより嘘みたいに簡単に作成することができました。

こんな具合です。

Haroongaのモジュールの中でBindings.Groonga.RawはGroonga 3.1.1のgroonga.hからc2hscを使って生成した後、すこし手直しをしています。また、Bindings.Groonga.CommandAPIはgroongaコマンドで出来るレイヤーのAPIを提供します。当初このモジュール名はSimpleAPIでした。CommandAPIの方がどのように使え、何が出来るのか、が分かるのではないかというGroongaのメーリングリストの指摘によりこのモジュール名を選択しました。
指摘して下さった須藤さんありがとうございます!

現時点ではまだHackageにリリースされていませんが、もう少しAPIを練ってみて自分なりに納得したらリリース…できるといいなぁと。

Hackageのアップロード権限の申請が通ったので、Hackageにリリースしました!

cabal install haroonga

でGroongaが導入済みで、Haskell Platformがインストールされている環境ならばインストールすることができます。