Cythonのどツボり方シリーズ(3)

まだ 0.22 なんてバージョンなんだから許してやってくれ、なんて言ってみたくもなる。

とはいえ、Cython の前身であるところの Pyrex から数えると、そこそこの歴史になってきたからね。その割には悩ましくて「で、どう直せばいいの」ってな不親切なコンパイルエラーは多いです。思えばCYTHONのどツボり方シリーズ(2)がまさにそうでしたね。

今回のは自分で気付いたものではなくて、4時間前に届いたばかりの Cython の ML からのネタです。こんな:

demo.pyx
1 cdef void (*foo)()
2 
3 cdef void bar() except*:
4     pass
5 
6 foo = bar

C というよりは C++ のダークサイド、かなぁ。こうなるそうです:

 1 Error compiling Cython file:
 2 ------------------------------------------------------------
 3 ...
 4 cdef void (*foo)()
 5 
 6 cdef void bar() except*:
 7     pass
 8 
 9 foo = bar
10         ^
11 ------------------------------------------------------------
12 
13 demo.pyx:6:9: Cannot assign type 'void (void)' to 'void (*)(void)'

いわく、こう言ってくれぃ:

1 demo.pyx:6:9: Function pointers have incompatible 'except *' declarations.

Cも知っててC++も知らないと、こちらの「親切であって欲しい」方でさえ理解に苦しむかもしれませんがね、例外仕様がくっついた(というよりは、とするならばC++なので)関数ポインタを、生Cの関数ポインタに代入してはなら~ん(出来~ん)ちうことね。

ML にあがった内容なので、デベロッパが反応すれば、近々修正されるかもしれないですね。