カウンター
- 197,859 アクセス
ちょっとした文章とかメモ書きとか。
Groongaのドキュメントの作業のお手伝いをしていく中で、自分の好きな言語の一つであるHaskellから使えたらなんて面白いんだろう、と思ったのでHaskellバインディングを書きました。
GroongaのC APIのHaskellバインディングの名前をHaroongaにしてみた #groonga
— コスモ (@cosmo__) 2014, 1月 14
ツイートにある通り、Haskell + GroongaでHaroonga(はろんが)です。
https://github.com/cosmo0920/haroonga
Groonga(ぐるんが)のようなどっしり(?)した響きではなく、Haroonga(はろんが)だと「Haskellの世界にはろー」みたいな軽いイメージが連想されますね。(「はろー」というよりも「はろろん」みたいなもっと砕けたイメージかなと思いますがまぁ置いておきましょうか。)
HaskellでFFIを使ったバインディングを書くにあたって何種類か方法があるわけですが、その中で使った方法がc2hscとhsc2hsを使う方法です。この方法を取ると、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はこの間の3連休の始めに構想を考えていて、終わる頃にはできてしまっていました。Haskell強い(白魔術)
— コスモ (@cosmo__) 2014, 1月 17
こんな具合です。
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がインストールされている環境ならばインストールすることができます。