福嶋です。
4月から環境が変わり、Rubyにあまり時間が取れず、ご無沙汰しておりま
す。

matz / netlab.co.jp (Yukihiro Matsumoto) wrote:
> swigrubyへの注文があります。
> 
>   * CのintをRubyのtrue/falseに変換するpragmaが欲しい。
> 
>     Rubyでは0がfalseでないので、そのまま変換したのでは期待通
>     りに動作しないので、このint型の関数は実はbooleanとしての
>     戻り値であることを示すpragmaが欲しいです。実際には
> 
>        %{
>        typedef int rb_Bool;
>        %}
> 
>        typedef int rb_Bool;
> 
>        %typemap(ruby,in) rb_Bool * {
>            $target = RTEST($source);
>        }
>        %typemap(ruby,out) rb_Bool {
>            $target = ($source)?Qtrue:Qfalse;
>        }

現状でも、boolという型名をtypedefして使うと、これとほぼ同じ扱いを
するようになっています。

>     のような方法で対応できないでもないですが、やはりまとめた
>     いのが人情です。

「まとめる」というのは、具体的にどういうイメージなのでしょうか?

>   * 述語メソッドの識別子に `?' を付けるpragmaが欲しい。
> 
>     現状では`?'をRuby側のメソッド名にする方法が無い(と思う) 

そうですね。現状ではalias pragmaを使うくらいしか無いですね。

> 両方とも述語(booleanを返すメソッド)に関するものですから、一
> つのpragmaで兼用しても私としては可です。いかがでしょう?

私のイメージでは、swigのpragmaは特定のメソッドの属性を指定するに
は向いてないような気がしてます。

pragmaではなくて、メソッド名のsuffixで表す方が、すっきりしそうに
思えるのですが、どうでしょうか。

%name(foo_p) int foo(void);  // => foo?

あるいは、boolを返り値とするメソッドには全て ? を付けてしまうか。

%{
typedef int bool;
%}
bool foo(void); // => foo?

---
福嶋正機