2025/06/29 20:28 Inline-C: Write inline C in Haskell

やっほー、ロボ子! 今日は`inline-c`について話すのじゃ!

`inline-c`ですか、博士。HaskellでCのコードを直接使えるようにする技術ですよね?

そうそう! Haskellモジュールの中でCライブラリを呼び出したり、Cのコードを埋め込んだりできるのじゃ。これがあれば、HaskellとCを同じファイルで自由に混ぜられるぞ!

それは便利ですね! FFI(Foreign Function Interface)は不要になるんですか?

そう! FFIは要らないのじゃ。データは最小限のオーバーヘッドで両方の言語でやり取りされるから、とっても効率的なのじゃ。

なるほど。レガシーコードや高性能な数値計算ライブラリを使う時に役立ちそうですね。

その通り! 例えば、Cの`cos()`関数をHaskellから呼び出すのも簡単なのじゃ。`[C.exp| double { cos(1) } |]`と書けば、Haskellの`IO CDouble`型として扱えるぞ。

`C.pure`を使うと、参照透過性のあるCコードを`IO`なしで使えるんですね。

そうじゃ! そして、複数のCの文を埋め込むときは`[C.block| ... |]`を使うのじゃ。Haskellの変数は`$(int n)`のように"anti-quoting"でCのコード内で参照できるぞ。

Cの型はHaskellの型に変換されるんですね。`int`が`CInt`に、`double`が`CDouble`になるように。

その通り! ポインタは`Ptr`になるのじゃ。ユーザー定義の構造体やenumも、`Storable`のインスタンスで、`C.context`で指定されていれば使えるぞ。

`C.Context`を使うと、カスタムCの型やanti-quoterを拡張できるんですね。

`C.vecCtx`コンテキストの`vec-len`と`vec-ptr` anti-quoterを使うと、HaskellのベクターをCで使えるのじゃ。`C.bsCtx`コンテキストなら、strictなByteStringをCで使えるぞ。

さらに、`C.funCtx`コンテキストの`fun` anti-quoterを使うと、Haskellの関数を関数ポインタに変換できるんですね!

そう! GHCiは`-fobject-code`フラグを付けて使うのじゃ。これで`inline-c`もバッチリじゃ!

とても勉強になりました、博士! `inline-c`を使えば、Haskellの可能性がさらに広がりますね。

じゃろ? ところでロボ子、C言語で「Hello, world!」と出力するプログラムを知っておるか?

はい、知っています。`printf`関数を使うんですよね。

正解! でも、Haskellで「Hello, world!」と出力するプログラムは?

`putStrLn`関数ですね。

そうじゃ! つまり、CとHaskellを組み合わせれば…「Hello, world!」が2倍楽しめる!…って、つまらんオチですまんのじゃ。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。