先日公開して、一部Exampleだけ実装してお茶を濁していた libui-ng のV言語実装、ようやく完成した。

https://github.com/funatsufumiya/v-libui/

正直、Odinのbindgenのクオリティが高くて、Odin言語版できたからもういいやって思ってたら、Issueを立ててくれた人がいて、「これよくできてるからAwesome Vに載せたい!」っていう嬉しいメッセージをもらって、そういやまだ未完成だったなーと思い出した。

実際、odin-libui のほうが一瞬で完成した割にはクオリティが高くて、V言語版は正直いろいろ誤魔化していた。C2Vの性能というか、V言語の制約がOdinよりもキツい部分があって、enumやstructの扱いをC2Vがゴニョゴニョしていたために、いろいろ誤魔化さなければならない事情があった。

特にV言語は名前付け制約があって、C.xxx として呼び出すC言語名前空間だけが特別扱いされている。そちらは自由に名前付けできる一方で、V言語側の名前空間に持ってくると急に厳しい制約がつけられる。

そのせいか、V言語では C.xxx で直接呼び出すように作られているライブラリがとても多くて、若干奇妙な感じになっている。まあ、C言語はメモリを手動でアロケートするし、V言語は nilunsafe でしか使えないので、「C言語使ってますよ!」ってわかるほうがいろいろ嬉しかったりはする。ここはOdinと違う部分だし、GC言語として仕方ない部分かもしれない。

それに加え、libui がクロスプラットフォーム対応のライブラリだったために、structの定義がOSによって違う部分があって、ヘッダーに定義されていなかったりした。V言語でそのへんをどう扱うかの知識がなかったので、voidptr で誤魔化していたのだけれど、voidptr のオンパレードになって相当可読性が下がってしまう事態になったので、Issue #4 で経緯を書いているように、Odinのラッパーから着想を得た実装で事なきを得た。

けどTinyCCの制約なのか、未定義structについて (?) はポインタかどうかコンパイラがよくわからなくなってしまう箇所がどうも存在するみたいで、TinyCCのバグなのかもしれないけれど、voidptr() で包んであげて生ポインタにキャストしなければならないものがたまに出てしまうことにはなった。ちょっとダサいしエラーメッセージは意味不明だけれど、全部 voidptr になってしまって可読性が下がるよりかはいいかとは思った(なのでIssueに注意をメモしてはいる)。

とりあえず、中途半端だったものが完成したのは嬉しい。こういうものも今後何かの役に立つことがあるかもしれないし、Awesome V とかに万一載るような事態になれば、もしバグレポートがあったら対応に追われるかもしれないので、今から潰しておける部分は潰しておけてよかったかもしれない。


このエントリーをはてなブックマークに追加follow us in feedly