HaskellでWPF
だがしかし、どうしてもgtkがなんとなくなじまない。
GUIに関してはWPFがすごく気に入っているので(WPFの最大の欠点は.Netだということだ)、WPFをどうしても使いたい、という気持ちを捨てきれなかった。
しょうがないから自分でラッパーを書いてみようか、ということで、C++/CLIでラッパーDLLを作って、FFIで呼び出してみたところ、思ったよりすんなりWindowを出すところまではいけた。
以下がHaskell側のコードの一部。
命名規約がHaskellっぽくないけど、将来的にWPF全体をラッピングしたらどういう命名規則にするのがいいかなあなどと浅はかな考えでとりあえずやってみた感じ。
threadWork :: Thread -> IO () threadWork thread = do app <- netApplication_New window <- netWindow_New netApplication_Run app window netApplication_Delete app return () main :: IO () main = do thread <- netThread_New netThread_SetApartmentState thread STA work <- wrapThreadWork $ threadWork netThread_Start thread work netThread_Join thread netThread_Delete thread return ()
こんな感じで動くようなところまではもってけるものの、当然のことながら.Netのクラスを全部手動でラッパー作成するのは労力的に無謀、ということでReflectionから情報吸い出して、対応するHaskellのコードやラッパーのコードを自動生成するようにしたいなあ。
ただ、問題はデリゲートを統一的に扱ういい方法が今のところまだ思いついてないということ。動的にILコードを生成するとかやればいけなくはなさそうだけど、まだ試せていない。
追記:ラッパークラスを作ってやるだけで割と簡単にいけるっぽい。
てか、これを応用するとIronRubyじゃないrubyからもWPFするとかもできそうね。
調べてみた限りではHaskellでWPFの需要はあまりなさそうに見えたんだけど、世間的にはどうなんだろう。もしいろいろうまく解決できたら、ちゃんとしたライラブリっぽくした方がいいのかしらん。