[Gauche-devel-jp] Re: SCM_RETURN(SCM_UNDEFINED) ?

Back to archive index

Makoto Satoh makot****@yahoo*****
2005年 4月 18日 (月) 10:30:33 JST


佐藤です。

ありがとうございます。

--- Shiro Kawai <shiro****@lava*****> からのメッセージ:
> > Cライブラリで関数がvoidを返すようになっている場合は、
> > SCM_UNDEFINEDを返すのが筋でしょうか?
> 
> そうですね。意味のある戻り値が無いわけですから。

なるほど。

> 例外として、Cライブラリ関数が複数の値をポインタ渡しした
> 領域に格納するような関数の場合は、Cのプロトタイプの戻り値がvoid
> であっても意味的には値を返していると考えられるので、Schemeでは
> 多値を返すようにする場合があります。例えばGdkのgdk_drawable_get_sizeは
> drawableを受け取って、そのwidthとheightを引数で渡されたポインタの
> 指す先に格納します:

なるほど、私の場合もこれに該当すると思います。
Schemeで考えると何らかの値を返して欲しいと考えてしまいます。
適切と思われる値を返すように自分で考えて書けばいいわけですね。

> 副作用を起こす関数のテストは、その副作用が本当に起きたかどうかを
> 調べるのが良いでしょう。

なるほど。しかし結構難しいですね。

PNGイメージをファイルに書き出すAPIがあるのですが、そのテストを
書こうとして悩みました。同じことを行うはずのCコードを外部プロセスで
走らせて、その結果のファイルとテストコード内で作成したファイルが
バイナリとして同じかどうかをcmpで比較したりするのかなあ、とか。

> なお、全ての引数がgenstub組み込みの型変換を使える場合、例えば次のような
> C関数fooがある場合:
> 
>  void foo(int x, int y)
> 
> define-cprocで引数型に<void>を指定すればUNDEFINEDを返すコードが
> 生成されます:
> 
>  (define-cproc foo (x::<int> y::<int>)
>  (return <void> "foo"))

すいません、こちらは分かりませんでした。上の条件を満たす場合に、
下記のようなdefine-cprocを書くと、Cでfoo(x, y)が実行されて
UNDEFINEDが返るコードがgenstubで生成されるということでしょうか?
あ、自分でやってみればいいですね。
これは条件が満たせる場合に一番手が抜ける方法ということですね。





Gauche-devel-jp メーリングリストの案内
Back to archive index