2004-04-04 [長年日記]
λ. gtk2hs-0.9.4 (その2)
数日間使ってみた感想。
他の言語でgtk2を使ったことがあればあまり戸惑わずに使える。けど、中途半端にインターフェースを変更している箇所もあるので注意。たとえば boxPackStart :: (BoxClass b, WidgetClass w) => b -> w -> Packing -> Int -> IO ()
はgtk_box_pack_start(GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding)
のexpandとfillの二つの引数をPacking
という型の単一の引数にまとめてしまってる。
実装を見ると、c2hsを使ってFFI周りのコードをCのヘッダファイルから自動生成した上で、その上にHaskellっぽいインターフェースを被せてる。これでだいぶ省力化出来てるのは素晴らしい。
ただ、シグナル周りとかの設計は少々ダサい気がする。実装にはg_signal_connect_data()
を使うよりもGClosure
の仕組みを活用した方が良いんじゃないかというのもあるが、それよりもまずシグナルごとに onClicked, afterClicked :: ButtonClass b => b -> IO () -> IO (ConnectIdo b)
みたいな関数があるのってどうなのよ?
僕だったら、例えば以下のようなインターフェースにしたと思う。こういう設計にしなかったのには何か理由があるのだろうか。
signalConnect, signalConnectAfter :: obj -> (Signal obj t) -> t -> IO (ConnectId obj)
signalEmit :: obj -> (Signal obj t) -> t
signalName :: Signal obj t -> String
...
clicked :: (ButtonClass b) => Signal b (IO ())